我有一个这样的课:
class A
{
public:
virtual void foo() { bar() }
protected:
virtual void bar() { /* do stuff */ }
}
Run Code Online (Sandbox Code Playgroud)
现在我想要一个覆盖foo和bar的派生类B. 所以我写了以下内容:
class B : public A
{
public:
virtual void foo() { A::foo(); /* then other stuff */ }
protected:
virtual void bar() { /* do different stuff */ }
}
Run Code Online (Sandbox Code Playgroud)
一切都编译但是当我调用B :: foo时,我希望B :: bar得到(最终)调用.相反,我得到A :: bar.我究竟做错了什么?
一切都编译但是当我调用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();
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到:
$ g++ g++ h.cc
$ ./a.out
B:foo()
A:foo()
B:bar()
Run Code Online (Sandbox Code Playgroud)
所以B :: bar()一切都很好.