c++ - 以多态方式捕获异常

标签 c++ exception inheritance reference virtual

这是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),我想这是有道理的,因为异常的静态类型(主题)是 A&。但是,为什么 B::print() 没有运行?动态类型“丢失”了吗?只有 A::print()a_ref.print(); 行中运行。

谁能解释一下?

最佳答案

throw 仅抛出其后表达式类型的对象。在这种情况下,subjectA& 类型,不管实际对象是什么,所以抛出一个 A(注意引用不能是抛出,因此制作了一个拷贝)。

您可以通过向抛出异常的异常类添加一个成员函数来处理这个问题。只要您在每个类中实现此方法,被调用的重写就会知道对象的运行时类型并且可以throw *this

http://www.ddj.com/cpp/184401940

关于c++ - 以多态方式捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1221697/

相关文章:

c++ - 从 DLL 获取 char *

C++ - shared_ptr<vector<T>> 与 vector<shared_ptr<T>>

java - BigInteger 抛出空指针异常

c++ - 如何在 Linux C++ 中捕获系统级异常?

Java 泛型 : override method that differs in parameterized return type

c++ - 为什么通过复制捕获的lambda具有与外部变量相同的地址

C++ - 返回 const 对象的 const vector 的 const vector

c# - 在 C# 中传达构造函数失败的最佳方式是什么?

node.js - Mongoose 模式继承和模型填充

.net - 有没有办法绕过 C#.NET 中的单类继承限制?