c – 以多态方式捕获异常
发布时间:2020-12-16 10:42:01 所属栏目:百科 来源:网络整理
导读:这是main(): int main(){ B b(1,"two","three"); try { f1(b); } catch(B b_ref) { cout"Caught B"endl; b_ref.print(); } catch(A a_ref) { cout"Caught A"endl; a_ref.print(); } system("pause"); return 0;} 这是f1(): void f1(A subject){ throw subj
这是main():
int main() { B b(1,"two","three"); try { f1(b); } catch(B& b_ref) { cout<<"Caught B&"<<endl; b_ref.print(); } catch(A& a_ref) { cout<<"Caught A&"<<endl; a_ref.print(); } system("pause"); return 0; } 这是f1(): void f1(A& subject) { throw subject; } 信息: B继承自A. A :: print()是虚拟的,并且在B中重新实现.捕获异常的catch是catch(A& a_ref),我认为这是有道理的,因为异常’static type(subject)是急症;.但是,为什么不运行B :: print()?动态类型“丢失”了吗?只有A :: print()在a_ref.print();行中运行. 有人可以解释一下吗? 解决方法
throw只抛出一个跟在它后面的表达式类型的对象.在这种情况下,无论实际对象是什么,主题都是A&类型,因此抛出A(注意不能抛出引用,因此进行复制).
您可以通过向引发异常的异常类添加成员函数来处理此问题.只要在每个类中实现此方法,被调用的覆盖将知道对象的运行时类型并且可以抛出* this. http://www.ddj.com/cpp/184401940 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |