Вызов базового метода из производного класса

У меня есть, например, такой класс:

class Base
{
   public: void SomeFunc() { std::cout << "la-la-la\n"; }
};

Я получаю новый из него:

class Child : public Base
{
   void SomeFunc()
   {
      // Call somehow code from base class
      std::cout << "Hello from child\n";
   }
};

И я хочу видеть:

la-la-la
Hello from child

Могу ли я вызвать метод из производного класса?


person Max Frai    schedule 20.10.2010    source источник


Ответы (4)


Конечно:

void SomeFunc()
{
  Base::SomeFunc();
  std::cout << "Hello from child\n";
}

Кстати, поскольку Base::SomeFunc() не объявляется virtual, Derived::SomeFunc() скрывает его в базовом классе, а не переопределяет его, что, несомненно, вызовет неприятные сюрпризы в долгосрочной перспективе. Поэтому вы можете изменить свою декларацию на

public: virtual void SomeFunc() { ... }

Это также автоматически делает Derived::SomeFunc() virtual, хотя вы можете явно объявить это так для ясности.

person Péter Török    schedule 20.10.2010

class Child : public Base
{
   void SomeFunc()
   {
      // Call somehow code from base class
      Base::SomeFunc();
      std::cout << "Hello from child\n";
   }
};

Кстати, вы можете сделать Derived::SomeFunc public тоже.

person Steve Townsend    schedule 20.10.2010
comment
Вероятно, вы также захотите сделать обе функции SomeFunc виртуальными, чтобы вы могли вызывать метод базового класса и вызывать метод производного класса. - person Colen; 20.10.2010
comment
Вы забыли удалить комментарий :) - person codymanix; 20.10.2010

Вы делаете это, снова вызывая функцию с префиксом имени родительского класса. Вы должны добавить префикс к имени класса, потому что может быть несколько родителей, которые предоставляют функцию с именем SomeFunc. Если бы существовала свободная функция с именем SomeFunc, и вы захотели бы вызвать ее, ::SomeFunc выполнила бы свою работу.

person stonemetal    schedule 20.10.2010

Да, ты можешь. Обратите внимание, что вы дали методам одно и то же имя, не квалифицируя их как virtual, и компилятор тоже должен это заметить.

class Child : public Base
{
   void SomeFunc()
   {
      Base::SomeFunc();
      std::cout << "Hello from child\n";
   }
};
person Keynslug    schedule 20.10.2010