【发布时间】:2019-06-16 04:29:42
【问题描述】:
我正在尝试找出我的代码中出现编译错误的原因:
class A
{
public:
virtual ~A(){}
};
class B: public A
{
public:
virtual ~B(){}
};
class D: public B
{
public:
virtual ~D(){}
};
template <class X, class Y>
X* fun(X* p){return dynamic_cast<Y*>(p);}
int main()
{
A* q = dynamic_cast<B*>(new D());
A* p = fun<D,B>(new D());
}
对我来说,指针 q 和 p 似乎应该指向相同的类型,但是对于 p,我得到一个编译器错误,提示“从‘B*’到‘D*’的无效转换”。我唯一没有收到错误的情况是当我以 B 是 D 的子类的方式更改类时(因此 p 是空指针)。谁能帮我理解为什么会这样?
【问题讨论】:
-
请注意,您返回的是
X*而不是Y*。 -
对不起,我没明白这个问题,所以最后一行代码将返回一个 D*,但由于 D 是 A 的子类,应该没问题,对吧?
-
问题是
fun无法从B*隐式转换为D*。dynamic_cast返回B*,但您尝试从需要D*的函数中返回它。看起来你的意思是让fun返回Y*。 -
您将指针转换为 base 类,然后尝试将其作为 派生 类指针返回。
-
我知道了,谢谢!
标签: c++ oop templates polymorphism dynamic-cast