dynamic_cast需要虚函数吗?

Does dynamic_cast require virtual function?

本文关键字:函数 cast dynamic      更新时间:2023-10-16

例如:

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将无法工作。

dynamic_cast可以强制转换为没有虚成员的相同类或基类。但是对于向下转换或转换到void*(它产生一个指向最派生类对象的指针),dynamic_cast需要一个多态类,根据c++ 11§5.2.7/6:

“否则,v必须是指向多态类型的指针或左值”

其中v是您提供的参数。

多态类是指具有一个或多个虚成员函数的类,§10.3/1:

声明or的类继承虚函数称为多态类。”

是的,根据标准,dynamic_cast只能下cast多态类型(即至少具有一个虚函数的类型)