struct A {};
struct B : A {};
int main()
{
A* a = new B();
B* b = dynamic_cast<B*>(a);
}
给出:
不能 dynamic_cast 'a'('struct A*' 类型)到类型 'struct B*'(源类型不是多态的)
我怎样才能使A
多态?我想安全地将它投射到 B.
(一种方法是添加一个虚拟虚函数,但有更好的方法吗?)
struct A {};
struct B : A {};
int main()
{
A* a = new B();
B* b = dynamic_cast<B*>(a);
}
给出:
不能 dynamic_cast 'a'('struct A*' 类型)到类型 'struct B*'(源类型不是多态的)
我怎样才能使A
多态?我想安全地将它投射到 B.
(一种方法是添加一个虚拟虚函数,但有更好的方法吗?)
您需要进行A
多态,您可以通过添加virtual
析构函数或任何虚函数来实现:
struct A {
virtual ~A() = default;
};
或者,在 C++11 之前,
struct A {
virtual ~A() {}
};
请注意,如果您打算通过指向基的指针安全地对派生类型的实例调用 delete,则多态类型无论如何都应该具有虚拟析构函数。
您至少需要一个virtual
函数 - 通常,如果没有其他函数合适,析构函数:
struct A {
virtual ~A() {}
};
正如您的编译器所说,您的类型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
}