【发布时间】:2012-02-23 00:46:20
【问题描述】:
我正在尝试这样的代码
//A.hpp
class A{
public:
A() {}
virtual const char *message() const {return "A ERROR";}
};
//B.hpp
#include "A.hpp"
class B:public A {
public:
B() {}
const char *message() const {return "B ERROR";}
};
//main.cpp
#include "A.hpp"
#include "B.hpp"
void foo(const A& a) {
/* case 1 */ throw a; /* (or) */ /* case 2 */ throw B(); // LINE 100
}
int main() {
B b;
A &a(b);
b.message(); // OUTPUT: B ERROR
try {
foo(a);
} catch (const A& a) {
std::cout<<"EXCEPTION CALLED "<<a.message()<<std::endl;
}
return 0;
}
在这种情况下,如果我使用 情况1: 扔一个; //a 是 B b 的引用; 输出:一个错误
案例 2: 抛出 B(); // 创建新的 B; 输出:B 错误
我不明白的是,为什么在两个情况下没有一致性,
如果你通过引用传递,所有的时间,应该有一些一致性, 如果我在函数内部创建一个新变量,在 try 块中调用,那么它会调用正确的虚拟方法,否则它不会......谁能告诉我控制流程......请指教。 ...
【问题讨论】:
标签: c++ exception polymorphism virtual-functions throw