通过引用捕获异常

new*_*mer 7 c++ reference exception

这个C++教程的标题为"标准异常"的部分中,有一个示例代码,它使用从STL中的标准异常类派生的类:

// standard exceptions
#include <iostream>
#include <exception>
using namespace std;

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex; //Declares an instance of myexception outside of the main function

int main () {
  try
  {
    throw myex;
  }
  catch (exception& e) //My question is regarding this line of code
  {
    cout << e.what() << endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该代码打印出来My exception happened.但是,如果我删除&符号,它会打印出来std::exception,这是what()使用标准异常类调用时发生的情况,而不是派生类.

该网站给出了这样的解释:

我们已经放置了一个通过引用捕获异常对象的处理程序(注意&符号和类型之后),因此这也捕获了从异常派生的类,就像myexception类的myex对象一样.

是什么myex样的"调用catch函数,并myex作为参数传递"?因为在这种情况下,我会想象你是按值还是通过引用抛出异常并不重要(这是&符号的权利?),因为你仍然在抛出一个myexception而不是一个exception.并且由于动态绑定和多态或类似的东西,e.what()应该仍然打印My exception happened而不是std::exception.

Fai*_*Dev 11

这是由于对象切片而发生的.

如果将派生类的对象分配给基类的实例(如通过值传递时使用副本c'tor),则派生类的所有信息都将丢失(切片).

例如,

class Base {
   int baseInfo;
};

class Derived : public Base
{
   int someInfo;
};
Run Code Online (Sandbox Code Playgroud)

然后,如果你写这个:

Derived myDerivedInstance;

Base baseInstance = myDerivedInstance;
Run Code Online (Sandbox Code Playgroud)

然后将"someInfo" myDerivedInstance输入baseInstance.