这是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
仅抛出其后表达式类型的对象。在这种情况下,subject
是 A&
类型,不管实际对象是什么,所以抛出一个 A
(注意引用不能是抛出,因此制作了一个拷贝)。
您可以通过向抛出异常的异常类添加一个成员函数来处理这个问题。只要您在每个类中实现此方法,被调用的重写就会知道对象的运行时类型并且可以throw *this
。
关于c++ - 以多态方式捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1221697/