C抛出引用指针
发布时间:2020-12-16 03:07:46 所属栏目:百科 来源:网络整理
导读:以下抛出的异常对象的类型是什么? 问题1 range_error r(“error”);扔r ANSWER1 range_error的对象 问题2异常* p = r;扔* p; ANSWER2一个例外的切片对象 问题3异常* p = r;抛出 ANSWER3抛出指向range_error的指针.捕获处理可以通过动态绑定访问range_error
以下抛出的异常对象的类型是什么?
问题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 *)块.答案是正确的,但是我会指定指针的类型,就像指针的类型一样. (指针的类型在某种程度上隐含在答案中) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |