我有一个类似的课程:
class A
{
public:
virtual void foo() { bar() }
protected:
virtual void bar() { /* do stuff */ }
}
现在我想要一个覆盖foo和bar的派生类B.所以我写了以下内容:
class B : public A
{
public:
virtual void foo() { A::foo(); /* then other stuff */ }
protected:
virtual void bar() { /* do different stuff */ }
}
一切都在编译,但是当我调用B :: foo时,我希望B :: bar得到(最终)调用。相反,我得到A :: bar。我做错了什么?
答案 0 :(得分:9)
一切都在编译,但是当我调用B :: foo时,我希望B :: bar得到(最终)调用。相反,我得到A :: bar。我做错了什么?
看起来您并不真正了解原始代码中出现的问题,认为虚拟覆盖机制必定是罪魁祸首,然后您发布了非工作示例描述你倾向于相信,但没有打扰来检查,因为如果你有,那么你会看到它不暴露描述的行为。这是你的例子的可编译版本。
#include <stdio.h>
class A
{
public:
virtual void foo() { puts("A:foo()"); bar(); }
protected:
virtual void bar() { puts("A:bar()"); }
};
class B : public A
{
public:
virtual void foo() { puts("B:foo()"); A::foo(); }
protected:
virtual void bar() { puts("B:bar()"); }
};
int main()
{
B b;
b.foo();
}
当我跑步时,我得到:
$ g++ g++ h.cc
$ ./a.out
B:foo()
A:foo()
B:bar()
所以B :: bar()一切都很好。
答案 1 :(得分:2)
这应该有效
A* b = new B();
b->bar(); //Notice that this is just an example
也适用于参考
void B::foo(){this->bar();}
B b;
A& ab = b;
ab.foo(); //calls B::bar()
答案 2 :(得分:0)
除了类定义末尾缺少的分号外,当前的OP代码按预期工作。