【发布时间】:2014-06-18 12:55:11
【问题描述】:
拥有
#include <iostream>
using namespace std;
class A {
public:
virtual void foo() {
cout << "A" << endl;
}
};
class B : public A {
public:
void foo() {
cout << "B" << endl;
}
};
class C : public B {
public:
void foo() {
cout << "C" << endl;
}
};
int main() {
C c;
B* b = &c;
b->foo();
return 0;
}
输出是C,但我期望的是B。
我没有用virtual 修饰符声明B::foo(),所以我希望函数调用由静态类型确定(无多态性)。
为什么会调用C::foo()?
是否可以在派生类中提供非虚函数,将虚函数隐藏在基类中?派生成员函数应该有什么签名以便b->foo() 调用它,而不是(b->*&A::foo)()
【问题讨论】:
-
B::foo()是虚拟的。你问题的前提是错误的。 -
virtual 继承自 A。您不需要重新指定它(尽管为了清楚起见我建议您这样做)。
-
@我已经给你的问题一个更准确的标题。这是一个合理的问题,可以得到一个很好的答案。既然您知道了这个问题,为什么不编辑您的问题以符合现实,以便其他人可以从一个好的解释中受益? (即“我没有将
B::foo()声明为虚拟”而不是“B::foo()` 不是虚拟的”) -
我建议不要将
virtual标记为B::foo,而是标记override。 -
实际上,我为您进行了我正在考虑的编辑。我希望这能保留您问题的本质,同时不再假设与现实相反的“事实”。
标签: c++ inheritance polymorphism overriding virtual-functions