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。
(一种方法是添加一个虚拟虚函数,但是有更好的方法吗?)
答案 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
}