1

可能重复:
常见问题解答:为什么 dynamic_cast 仅在类具有至少 1 个虚拟方法时才有效?

我在 C++ 中读过,在一组类的层次结构中执行动态转换,只有在类是多态的情况下才允许转换,例如当基类具有虚函数时等。什么是这种限制的原因是什么?在基类中使用纯虚函数代替普通虚函数是否更“安全”?

谢谢你!

4

3 回答 3

3

这种限制的原因是什么?

dynamic_cast仅当对象是目标类型的实例时才应该成功。非多态类不包含任何类型信息,因此无法判断是否是这种情况;因此,演员阵容无法成功。

在基类中使用纯虚函数代替普通虚函数是否更“安全”?

就多态性而言,两者都可以。如果基类至少有一个虚函数,那么它是多态的,因此可以与dynamic_cast. 纯与否只影响基类能否实例化。

于 2012-01-13T12:32:20.683 回答
2

执行dynamic_cast时会在运行时执行类型检查,并且std::bad_cast在强制类型转换非法时抛出异常或返回空指针。允许这样做的机制称为RTTI

如果类不是多态的,则无法执行该类型检查,因为在运行时没有存储类型信息。

于 2012-01-13T11:48:12.900 回答
2

这是标准引起的限制。

在主要实现中,dynamic_cast通过比较vfptr两个类的虚函数表指针来工作。

这是确定类在运行时是否相关的一种方法。dynamic_cast此外,在非多态类上做 a 真的没有意义。static_cast为此。

dynamic_cast我的猜测是,如果您尝试在非多态类上使用,那么您做错了。如果您发布一些代码,我们可以提供帮助。

于 2012-01-13T11:48:35.083 回答