为什么编译器会抱怨我的dynamic_cast?

Dib*_*iba 0 c++ oop polymorphism templates dynamic-cast

我试图找出代码中编译错误的原因:

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());
}
Run Code Online (Sandbox Code Playgroud)

对我来说,似乎指针q和p应该指向相同的类型但是对于p我收到编译器错误,说"无效转换从'B*'到'D*'".我唯一没有得到错误的是当我以B的子类为D(因此p是空指针)的方式更改类时.谁能帮我理解为什么会这样?

Yak*_*ont 5

template <class X, class Y>
X* fun(X* p){return dynamic_cast<Y*>(p);}
Run Code Online (Sandbox Code Playgroud)

这个函数接受X*并返回一个X*.

在身体里,你把它投到了Y*.然后,您尝试将其隐式转换为X*.

你得到的错误是在你的身体里fun,你把D*它扔到一个B*,然后试着隐式地把它D*再次投射到一个.那失败了.因此你的错误.

在查看编译器错误时,它会有所帮助

  1. 让每个陈述都在自己的路线上.如果语句很复杂,请将其分解为多个语句.

  2. 查看编译器说明错误的行.

修复是:

template <class X, class Y>
Y* fun(X* p){return dynamic_cast<Y*>(p);}
Run Code Online (Sandbox Code Playgroud)

现在您的代码将起作用.