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

时间:2013-02-27 14:05:59

标签: c++ c++11

struct A {};

struct B : A {};

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

    B* b = dynamic_cast<B*>(a);
}

给出:

  

cannot dynamic_cast 'a' (of type 'struct A*') to type 'struct B*' (source type is not polymorphic)

如何使A多态?我想安全地把它投到B。

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

3 个答案:

答案 0 :(得分:90)

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

struct A {
  virtual ~A() = default;
};

或者,在C ++ 11之前,

struct A {
  virtual ~A() {}
};

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

答案 1 :(得分:10)

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

struct A {
   virtual ~A() {}
}; 

答案 2 :(得分:4)

正如您的编译器所说,您的类型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
}