加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读