Вопрос о виртуальных функциях C ++ - PullRequest
0 голосов
/ 19 февраля 2010

Привет, так что если у меня есть Базовый класс и 2 производных класса ...

class Base
{
  virtual void Output()
  {
     cout << "OUTPUTTING A BASE OBJECT" << endl;
  }
};

class Derived : public Base
{
   void Ouput()
   {
     cout << "OUTPUTTING A DERIVED" << endl;
   }
};

class OtherDerived : public Base
{

};

Насколько я понимаю, если я попытаюсь вызвать Output from OtherDerived, произойдет сбой. Есть ли способ переопределить вывод для некоторых производных версий Base, но не для других?

Ответы [ 2 ]

10 голосов
/ 19 февраля 2010

Вызов Output для объектов класса OtherDerived завершается неудачей не потому, что он виртуальный, а потому, что он объявлен private в Base (ну, не явно - но private является значением по умолчанию в классах, когда ничего другого указано)

Изменить объявление Base на:

class Base
{
public:
  virtual void Output()
  {
     cout << "OUTPUTTING A BASE OBJECT" << endl;
  }
};

И это будет работать. protected тоже будет работать. Поскольку Output не является чисто виртуальным , его можно вызывать из подклассов, которые не переопределяют его.

0 голосов
/ 19 февраля 2010

Это не приведет к ошибке - это вызовет Base :: Output. То, что вы хотите, т.е. переопределение «для некоторых производных классов, но не для других» означает , как работает наследование. Вам не нужно ничего делать дальше.

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