我对使用C++重新生成的对象的类型非常困惑。例如,在上面的代码中,为什么输出241?在C++中重新抛出了什么对象?
我的理解是,在第1行中,类Bar的对象被抛出。它在第2行中被捕获。Bar类型的对象被切片为Foo类型。
但是,当异常被重新抛出时,它的类型是什么?为什么第3行被执行?这不是Foo吗?
重新抛出的基本策略是什么?类型保持不变?或者有什么改变?
#include <iostream>
using namespace std;
class Foo{
public:
Foo(int i): i(i) {}
Foo(){}
int i;
};
class Bar: public Foo{
public:
Bar(int i): Foo(i) {}
Bar(const Bar& b){i=b.i;}
};
int main() {
Bar b(1);
try{
try{
throw b; //Line 1
}
catch(Foo& e){
e.i=2; //Line 2
cout<<e.i;
throw;
}
catch(Bar& e){
e.i = 3;
cout<<e.i;
throw e;
}
}
catch (Bar e) {
e.i*=2; //Line 3
cout<<e.i;
}
catch (Foo e) {
e.i*=3;
cout<<e.i;
}
cout<<b.i;
return 0;
}
事实上,它在这里被引用捕获并不重要。 – ephemient 2010-01-08 02:22:00
是的,重新抛出什么并不重要。这对于catch块中可见的内容以及打印的内容很重要,因为提问者似乎认为逐引用会切片。 – 2010-01-08 02:26:46