以下抛出的异常对象的类型是什么?
问题1> range_error r(“error”);扔r
ANSWER1> range_error的对象
问题2>异常* p =& r;扔* p;
ANSWER2>一个例外的切片对象
问题3>异常* p =& r;抛出
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”
解决方法
我认为你们三个都是对的.被抛出的对象(IIRC)的类型是被抛出的对象的静态类型.我必须深入标准一段时间才能找到确切的引号,但是一个简单的例子似乎证实了这一点:
struct base {}; struct derived : base {}; void t() { derived d; base * b = &d; throw *b; } int main() { try { t(); } catch ( derived const & ) { std::cout << "derived" << std::endl; } catch ( base const & ) { std::cout << "base" << std::endl; } }
如果使用被抛出的对象的动态类型,则* b将具有派生类型,第一个catch将成功,但从经验上讲第二个catch被执行(g).
在最后一种情况下,抛出的对象是指向一个range_error对象的异常的指针.稍微的区别又是可以被捕获的,编译器不会捕获catch(range_error *)块.答案是正确的,但是我会指定指针的类型,就像指针的类型一样. (指针的类型在某种程度上隐含在答案中)