C ++继承问题

时间:2010-07-19 16:49:54

标签: c++ polymorphism

我有一个类似的课程:

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。我做错了什么?

3 个答案:

答案 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代码按预期工作。