dynamic_cast需要虚函数吗?

4

例如:

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

4
仅当一个类有虚成员函数时,它才是多态的。 - chris
3
顺便提一下,如果一个类打算作为多态使用,那么它真的应该有一个虚析构函数。 - Brian Bi
2个回答

9
dynamic_cast可以将指针转换为相同类或基类,而无需虚成员。 但是,对于向下转型或转换为void*(产生指向最派生类对象的指针)的情况,根据C++11 §5.2.7 / 6,dynamic_cast要求使用多态类:

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

这里的v是您提供的参数。
一个多态类是指具有一个或多个虚成员函数的类,§10.3 / 1:

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


8

是的,根据标准,dynamic_cast只能将多态类型(即至少有一个虚函数的类型)向下转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接