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.