<分区>
我想找出我的代码中编译错误的原因:
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 是空指针)。谁能帮我理解为什么会这样?