不能贬低因为班级不是多态的?

wfb*_*ale 43 c++ polymorphism inheritance vtable

是否有可能没有虚拟方法的继承?编译器说以下代码不是多态的.

例:

Class A(){
    int a;
    int getA(){return a;};
}


Class B(): A(){
    int b;
    int getB(){return b;};
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我们试图从一个A对象向下转换为一个B对象:

 A *a;
 B *b = dynamic_cast<B*>(a)
Run Code Online (Sandbox Code Playgroud)

但是这会产生以下错误:

 cannot dynamic_cast ... (source type is polymorphic)
Run Code Online (Sandbox Code Playgroud)

Dav*_*e S 70

语法错误不能承受,你不能dynamic_cast是非多态类型. static_cast如果你知道它实际上是目标类型的对象,那么你将在这种情况下使用.

原因: static_cast基本上编译器在编译时执行检查"输入是否可以转换为输出?" 这可用于向上或向下构建指针(或引用)的继承层次结构的情况.但检查只在编译时进行,编译器假定您知道自己在做什么.

dynamic_cast只能在指针或引用强制转换的情况下使用,并且除了编译时间检查之外,它还会执行额外的运行时检查强制转换是否合法.它要求所讨论的类至少有一个虚方法,它允许编译器(如果它支持RTTI)执行这个额外的检查.但是,如果有问题的类型没有任何虚拟方法,则无法使用它.

最简单的情况,如果你像这样传递指针可能是值得的,就是考虑使基类的析构函数是虚拟的.除了允许您使用动态强制转换之外,它还允许在删除基类指针时调用正确的析构函数.


ten*_*ica 30

您需要在类中至少有一个虚拟方法run-time type information (RTTI)才能成功应用dynamic_cast运算符.


use*_*954 13

只需将析构函数设为虚拟(为了安全,总是为任何类做).

  • 不是为了任何类,而是为了作为基类的类 (7认同)

Mur*_*hna 6

是的,不允许用于非多态类型的 dynamic_cast。基类应至少有一个虚方法。只有这样,该类才能被称为多态。

这篇文章解释了一个类似的例子:http : //www.cplusplus.com/doc/tutorial/typecasting/