#include <iostream>
struct GeneralException {
virtual void print() { std::cout << "G"; }
};
struct SpecialException : public GeneralException {
void print() override { std::cout << "S"; }
};
void f() { throw SpecialException(); }
int main() {
try {
f();
}
catch (GeneralException e) {
e.print();
}
}
在main方法中,调用f()时,它将抛出SpecialException。我很困惑,会抛出SpecialException()吗?它会调用struct SpecialException的构造函数(未定义)。
最佳答案
代码:
throw SpecialException();
这个默认构造一个
SpecialException
实例并抛出它。没有为SpecialException
注册的特定处理程序,但对于基类GeneralException
按值有一个处理程序,这意味着您的SpecialException
实例将被复制-切片到GeneralException
中,并且结果是.. G
的打印如果希望/期望打印
S
,则必须通过引用(最好是const
)捕获该异常,这将需要在两个实现中都使print
为const。结果将如下所示:#include <iostream>
struct GeneralException {
virtual void print() const { std::cout << "G"; }
};
struct SpecialException : public GeneralException {
void print() const override { std::cout << "S"; }
};
void f() { throw SpecialException(); }
int main() {
try {
f();
}
catch (GeneralException const& e) {
e.print();
}
}
输出量
S