【发布时间】:2010-01-28 23:58:17
【问题描述】:
给定以下代码
class T {
public:
virtual ~T () {}
virtual void foo () = 0;
};
class U {
public:
U() {}
~U() {}
void bar () { std::cout << "bar" << std::endl; }
};
class A : public U, public T {
public:
void foo () { std::cout << "foo" << std::endl; }
};
int main () {
A * a = new A;
std::vector<U*> u;
std::vector<T*> t;
u.push_back(a);
t.push_back(reinterpret_cast<T*>(u[0]));
u[0]->bar ();
t[0]->foo ();
delete a;
return 0;
}
我得到了我期望的输出
bar
foo
但是,如果我将U 的定义更改为
class U {
public:
U() {}
virtual ~U() {}
virtual void bar () { std::cout << "bar" << std::endl; }
};
我仍然可以正常编译并且没有警告/错误,但现在的输出是
bar
bar
虚拟声明阻止我调用foo 的原因是什么?
【问题讨论】:
-
reinterpret_cast 是万恶之源。创建它只是为了让您的团队负责人知道在您的代码中使用 grep 来查找错误;)。
-
@KornelKisielewicz,这句话太棒了!
-
您可以在任何指向
T或A的指针上调用foo。foo与U无关。所以我不太明白你在U中对“虚拟声明”的评论。
标签: c++ multiple-inheritance virtual-functions