【发布时间】:2019-07-15 15:44:20
【问题描述】:
在阅读异常时,我了解到在抛出一个对象时,一个对象总是基于静态类型信息构造的。如果发生异常,我们如何抛出一个子类对象呢?以下是《更有效的 C++》一书中的一些内容:
class Widget{...}; class SpecialWidget: public Widget {...}; void passAndThrowWidget() { SpecialWidget localSpecialWidget; ... Widget& rw = localSpecialWidget; throw rw; // this throws an exception of type widget! }这里会抛出一个 Widget 异常,即使 rw 引用了
SpecialWidget。那是因为 rw 的静态类型是 Widget,而不是 Special-Widget。 rw 实际上指的是 SpecialWidget与您的编译器无关;他们只关心 rw 的静态类型。
This 解释了它发生的原因,但没有提供问题的解决方案。
【问题讨论】:
-
@MichaelChourdakis:为什么不呢?它是对
localSpecialWidget的基类部分的引用。 -
这是一个伪代码,其中 rw 引用持有一个子类对象。
-
@MichaelChourdakis 为什么不呢?基类引用可以绑定到派生类对象。