C++继承问题

Dan*_*iel 1 c++ polymorphism

我有一个这样的课:

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.我究竟做错了什么?

Nor*_*ame 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();
}
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()一切都很好.