#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

09-12 22:49