dynamic_cast 不适用于非多态类型的原因
The reason why dynamic_cast doesn't work with non-polymorphic types
With classes B
and derived class D
:
class B {
int b;
};
class D : public B {
int d;
};
D* d = new D();
B* b = dynamic_cast<B*>(d);
上面的代码可以正常工作——这是一个简单的向上转换。我们确定 b
指向的任何东西都包含 B
class(子)对象。
然而,
B* b = new D();
D* d = dynamic_cast<D*>(b);
即使 b
指向一个有效的 D
实例, 也不会编译——因为基础 class 不是多态的。所以只添加一个空虚方法就可以解决问题。
重要的问题是为什么 C++ 要求源类型是多态的?我发现的唯一解释是 this,但它只是说“因为这是内部实现的方式”——至少在我看来是这样)。设计 dynamic_cast
的人可能还有其他一些原因 - 那是什么?
dynamic_cast
的前提是它使用 RTTI(大概每个实现都使用相同的底层数据结构来支持 dynamic_cast
和 RTTI - 类型信息必须存在于某个地方并且不同的表示形式两个用例没有意义)以确保您尝试的转换在运行时是正确的类型。如果 from-class 是非多态的,编译器将无法使用类型信息来进行类型检查(决定 return 0 或转换后的指针)。
因为如果不在对象中存储一些类型信息以供 运行 次使用,就无法实现 dynamic_cast
。该语言只有两个特性需要 运行 次对象类型信息:虚函数和 dynamic_cast
.
如果可以使用 dynamic_cast
向下转换非多态类型,编译器将不得不在 每个 中存储 运行 时间类型信息 class类型。这将直接违背 C++ 的 "only pay for what you use" 理念,并且 完全 破坏其与 C 和许多外部接口、硬件等的兼容性。不会有标准布局 class 类型,基本上。或者,没有 class 类型,您可以完全控制它们的布局。
With classes B
and derived class D
:
class B {
int b;
};
class D : public B {
int d;
};
D* d = new D();
B* b = dynamic_cast<B*>(d);
上面的代码可以正常工作——这是一个简单的向上转换。我们确定 b
指向的任何东西都包含 B
class(子)对象。
然而,
B* b = new D();
D* d = dynamic_cast<D*>(b);
即使 b
指向一个有效的 D
实例,也不会编译——因为基础 class 不是多态的。所以只添加一个空虚方法就可以解决问题。
重要的问题是为什么 C++ 要求源类型是多态的?我发现的唯一解释是 this,但它只是说“因为这是内部实现的方式”——至少在我看来是这样)。设计 dynamic_cast
的人可能还有其他一些原因 - 那是什么?
dynamic_cast
的前提是它使用 RTTI(大概每个实现都使用相同的底层数据结构来支持 dynamic_cast
和 RTTI - 类型信息必须存在于某个地方并且不同的表示形式两个用例没有意义)以确保您尝试的转换在运行时是正确的类型。如果 from-class 是非多态的,编译器将无法使用类型信息来进行类型检查(决定 return 0 或转换后的指针)。
因为如果不在对象中存储一些类型信息以供 运行 次使用,就无法实现 dynamic_cast
。该语言只有两个特性需要 运行 次对象类型信息:虚函数和 dynamic_cast
.
如果可以使用 dynamic_cast
向下转换非多态类型,编译器将不得不在 每个 中存储 运行 时间类型信息 class类型。这将直接违背 C++ 的 "only pay for what you use" 理念,并且 完全 破坏其与 C 和许多外部接口、硬件等的兼容性。不会有标准布局 class 类型,基本上。或者,没有 class 类型,您可以完全控制它们的布局。