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

时间:2011-12-12 04:22:36

标签: c++ inheritance polymorphism vtable

是否可以在没有虚拟方法的情况下进行继承?编译器说下面的代码不是多态的。

示例:

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


Class B(): A(){
    int b;
    int getB(){return b;};
}

在另一个类中,我们尝试从A对象转发到B对象:

 A *a;
 B *b = dynamic_cast<B*>(a)

但是这会出现以下错误:

 cannot dynamic_cast ... (source type is polymorphic)

5 个答案:

答案 0 :(得分:65)

语法错误不能承受,你不能dynamic_cast非多态类型。 static_cast是您在这种情况下使用的强制转换,如果您知道它实际上是目标类型的对象。

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

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

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

答案 1 :(得分:24)

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

答案 2 :(得分:13)

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

答案 3 :(得分:4)

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

本文解释了一个类似的示例:http://www.cplusplus.com/doc/tutorial/typecasting/

答案 4 :(得分:2)

A a;
B *b = dynamic_cast<B*>(a)

这里a是一个对象,b是一个指针。

实际上,C ++中允许使用向上转换和向下转换。但在使用向下转换时,应注意以下两点: 1超类应该至少有一个虚方法。 2由于超类比子类“小”,所以应该仔细使用内存对象。