下面抛出的异常对象的类型是什么:
问题1>range_error r("error"); throw r;
答案1> range_error 的对象
问题2>exception *p = &r; throw *p;
答案2>异常的切片对象
问题3>exception *p = &r; throw p;
Answer3> 抛出一个指向range_error的指针。捕获处理可以通过动态绑定访问range_error成员函数。
这些问题我答对了吗?
// 更新并在VS2010上编译运行
#include <iostream>
using namespace std;
class ExClassA
{
public:
virtual void PrintMe() const
{
cout << "ExClassA" << endl;
}
};
class ExClassB : public ExClassA
{
public:
virtual void PrintMe() const
{
cout << "ExClassB" << endl;
}
};
int main(int argc, char* argv[])
{
ExClassB exClassB;
ExClassA *p = &exClassB;
try
{
throw *p;
}
catch (const ExClassA& e)
{
e.PrintMe();
}
try
{
throw p;
}
catch (const ExClassA* e)
{
e->PrintMe();
}
}
上述程序的第一个 try-catch 打印“ExClassA”
上述程序的第二个 try-catch 打印“ExClassB”
抛出一个对象总是会导致抛出的对象是copy您抛出的对象的静态类型,基于该对象的静态类型。因此你的前两个答案是正确的。
第三个有点复杂。如果你catch(range_error*)
您不会捕获异常,因为类型不匹配。如果你catch(exception*)
您将无法访问以下成员range_error
在捕获的指针中;你可以dynamic_cast
不过,该指针返回 range_error 指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)