Вопрос о наследовании C ++ - PullRequest
1 голос
/ 19 июля 2010

У меня есть такой класс:

class A
{
   public:
      virtual void foo() { bar() }

   protected:  
      virtual void bar() { /* do stuff */ }
}

Теперь я хочу получить производный класс B, который переопределяет как foo, так и bar.Поэтому я написал следующее:

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 ]

9 голосов
/ 19 июля 2010

Все компилируется, но когда я вызываю 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 () все в порядке.

2 голосов
/ 19 июля 2010

до обновления по оп.

Это должно работать

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()
0 голосов
/ 19 июля 2010

За исключением пропущенных точек с запятой в конце определений классов, текущий код OP работает как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...