dynamic_cast是否需要虚函数?

时间:2014-05-30 00:09:20

标签: c++

例如:

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将不起作用。

2 个答案:

答案 0 :(得分:8)

是的,按照标准,dynamic_cast只能转发多态类型(即至少有一个虚函数的类型)

答案 1 :(得分:8)

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

  

“否则,v应该是多态类型的指针或左值”

其中v是您提供的参数。

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

  

“宣布或的类   继承虚函数称为多态类。“