use*_*357 5 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);
Run Code Online (Sandbox Code Playgroud)
上面的方法可以正常工作-这只是简单的转换。我们确定b所指向的B对象中都有类(子)对象。
然而,
B* b = new D();
D* d = dynamic_cast<D*>(b);
Run Code Online (Sandbox Code Playgroud)
即使b指向有效D实例也不会编译-因为基类不是多态的。因此,仅添加一个空的虚拟方法即可解决该问题。
重要的问题是为什么C ++要求源类型是多态的?我发现的唯一的解释是这样的,但它只是规定“因为这是它的内部实现” -至少在我的眼睛)。设计人员dynamic_cast可能还会想到其他一些原因-那是什么?
dynamic_cast因为如果对象中没有存储一些类型信息以供运行时使用,则无法实现。该语言只有两个功能需要对象类型的运行时信息:虚拟函数和dynamic_cast.
如果可以使用向下转换非多态类型,编译器将必须在每个类类型dynamic_cast中存储运行时类型信息。这将直接违背 C++ 的“只为你使用的东西付费”的理念,并且它将彻底破坏它与 C 和许多外部接口、硬件等的兼容性。基本上不会有标准布局类类型。或者,没有可以完全控制其布局的类类型。