尝试使用dynamic_cast时,获取"源类型不是多态的"

And*_*zos 60 c++ c++11

struct A {};

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a);
}
Run Code Online (Sandbox Code Playgroud)

得到:

不能dynamic_cast'a'('struct A*'类型)来输入'struct B*'(源类型不是多态的)

我如何制作A多态?我想安全地把它投到B.

(一种方法是添加一个虚拟虚函数,但是有更好的方法吗?)

jua*_*nza 96

您需要创建A多态,您可以通过添加virtual析构函数或任何虚函数来执行:

struct A {
  virtual ~A() = default;
};
Run Code Online (Sandbox Code Playgroud)

或者,在C++ 11之前,

struct A {
  virtual ~A() {}
};
Run Code Online (Sandbox Code Playgroud)

请注意,如果您打算通过指向基类的指针安全地在派生类型的实例上调用delete,则多态类型应该具有虚拟析构函数.

  • 大概你的意思是"默认"而不是"删除"?! (3认同)
  • @Bathsheba 谢谢!我颠倒了你编辑的逻辑。 (2认同)

Luc*_*ore 11

您至少需要一个virtual函数 - 通常,如果没有其他函数适合,则析构函数:

struct A {
   virtual ~A() {}
}; 
Run Code Online (Sandbox Code Playgroud)


And*_*owl 5

正如编译器所说,您的类型A不是多态的。您应该virtual为其添加一个功能。例如,virtual析构函数可能是一个不错的选择:

struct A { virtual ~A() { } };
//         ^^^^^^^ This makes A a polymorphic type

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a); // Should work now
}
Run Code Online (Sandbox Code Playgroud)