C++ dynamic#u cast没有';不适用于非多态类型

C++ dynamic#u cast没有';不适用于非多态类型,c++,polymorphism,dynamic-cast,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指向有效的D实例,也不会编译,因为基类不是多态的。因此,只添加一个空的虚拟方法就可以解决这个问题 重要的问题是C++为什么要求源类型是多态的?我找到的唯一解释是,但它只是说‘因为这是它内部实现的方式’——至少在我看来是这样)。设计dynamic

对于类
B
和派生类
D

class B {
    int b;
};


class D : public B {
    int d;
};


D* d = new D();
B* b = dynamic_cast<B*>(d);
即使
b
指向有效的
D
实例,也不会编译,因为基类不是多态的。因此,只添加一个空的虚拟方法就可以解决这个问题


<>重要的问题是C++为什么要求源类型是多态的?我找到的唯一解释是,但它只是说‘因为这是它内部实现的方式’——至少在我看来是这样)。设计
dynamic\u cast
的人可能还有其他一些原因-那是什么?

dynamic\u cast的前提是它使用RTTI(假设每个实现都使用相同的底层数据结构来支持
动态_cast
和RTTI-类型信息必须存在于某个地方,两个用例的不同表示方式没有意义)确保您尝试的强制转换在运行时是正确的类型。如果from类是非多态的,则类型信息将不可用于编译器进行类型检查(以决定返回0或转换的指针).

因为如果没有对象中存储的某些类型信息供运行时使用,就无法实现
动态\u cast
。而且该语言只有两个功能需要对象类型的运行时信息:虚拟函数和
动态\u cast


如果可以使用
dynamic\u cast
来降级非多态类型,编译器将不得不在每个类类型中存储运行时类型信息。这将直接违背“只为您使用的内容付费”的原则C++哲学,它将彻底打破它与C和许多外部接口、硬件等的兼容性。基本上没有标准的布局类类型。或者,没有类类型可以完全控制其布局。

我没有看到任何动态多态性。你已经错过了至少一个代码> VIRT.ual基类中的析构函数。在发布充满错误的代码之前,请使用编译器。@DieterLücking说得很对,但这里的关键部分不是确切的代码。我想说,这就足以证明其意图了。这不是一个实现细节吗?所以多态类型的对象存储关于其真实类型的信息,更多r less?@user5539357是的。他们需要以某种形式存储这些信息,以便能够正确地执行动态分派(虚拟函数)。
B* b = new D();
D* d = dynamic_cast<D*>(b);