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

StackOverflow https://stackoverflow.com/questions/3980011

  •  09-10-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Конечно:

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

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

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

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

Другие советы

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

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

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

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

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

class Child : public Base
{
   void SomeFunc()
   {
      Base::SomeFunc();
      std::cout << "Hello from child\n";
   }
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top