例如:
class Animal
{
virtual void dummy() {}; //LINE1
}
class Cat : public Animal
{
}
Animal* a = new Cat();
if (Cat* c = dynamic_cast<Cat*> (a)) //LINE2
{
//Do something.
}
如果我从Animal类中删除LINE1(即Animal类不包含虚拟成员),则LINE2将不起作用。
答案 0 :(得分:8)
是的,按照标准,dynamic_cast
只能转发多态类型(即至少有一个虚函数的类型)
答案 1 :(得分:8)
dynamic_cast
可以在没有虚拟成员的情况下强制转换为同一个类或基类。但是对于向下转换或转换为void*
(产生指向最派生类对象的指针)dynamic_cast
需要一个多态类,根据C ++11§5.2.7/ 6:
“否则,
v
应该是多态类型的指针或左值”
其中v
是您提供的参数。
多态类是具有一个或多个虚拟成员函数的类,§10.3/ 1:
“宣布或的类 继承虚函数称为多态类。“