gpt4 book ai didi

c++ - 将子类对象作为异常抛出

转载 作者:行者123 更新时间:2023-11-30 01:02:01 25 4
gpt4 key购买 nike

在阅读异常时,我了解到在抛出一个对象时,对象总是基于静态类型信息构造的。如果发生异常,我们如何抛出一个子类对象呢?以下是 More Effective C++ 书中的一些行:

class Widget{...};

class SpecialWidget: public Widget {...};

void passAndThrowWidget()
{
SpecialWidget localSpecialWidget;
...
Widget& rw = localSpecialWidget;
throw rw; // this throws an exception of type widget!
}

Here a Widget exception is thrown, even though rw refers to a SpecialWidget. That's because rw's static type is Widget, not Special-Widget. That rw actually refers to a SpecialWidget is of no concern to your compilers; all they care about is rw's static type.

This解释了为什么会发生,但没有提供问题的解决方案。

最佳答案

你需要添加

virtual void throwYourself() = 0;

到 Widget 类。并用

实现它
void SpecialWidget::throwYourself() override { throw *this; }

然后,您可以在基指针对象上调用 throwYourself()。这是否是一个好的设计是另一个我无法回答的问题。

关于c++ - 将子类对象作为异常抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57043153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com