dynamic_cast不适用于非多态类型的原因

时间:2016-03-01 17:33:22

标签: c++ polymorphism dynamic-cast

使用类B和派生类D

class B {
    int b;
};


class D : public B {
    int d;
};


D* d = new D();
B* b = dynamic_cast<B*>(d);

以上工作正常 - 这是一个简单的向上翻译。我们确信无论b指向什么,其中都有B类(子)对象。

然而,

B* b = new D();
D* d = dynamic_cast<D*>(b);
即使b指向有效的D实例,

也不会编译 - 因为基类不是多态的。因此,只添加一个空虚拟方法可以解决问题。

重要的问题是为什么C ++要求源类型是多态的?我发现的唯一解释是this,但它只是说“因为它是如何在内部实施的” - 至少在我看来是这样。设计dynamic_cast的人可能还有其他一些原因 - 那些是什么?

2 个答案:

答案 0 :(得分:4)

因为如果没有存储在对象中的某些类型信息以供运行时使用,则无法实现dynamic_cast。并且该语言只有两个功能需要关于对象类型的运行时信息:虚函数和dynamic_cast

如果可以使用dynamic_cast向下转换非多态类型,则编译器必须在每个类类型中存储运行时类型信息。这将直接违反&#34;只支付您使用的费用&#34; C ++的哲学,它将完全打破与C和许多外部接口,硬件等的兼容性。基本上没有标准布局类类型。或者,也就是说,没有可以完全控制其布局的类类型。

答案 1 :(得分:3)

dynamic_cast的前提是它使用RTTI(可能每个实现使用相同的底层数据结构来支持dynamic_cast和RTTI - 类型信息必须存在于某处并且两种用途的不同表示形式在没有意义的情况下确保你正在尝试的强制转换在运行时是正确的类型。如果from-class是非多态的,则编译器无法使用类型信息进行类型检查(决定返回0或转换后的指针)。