в С++ при создании подклассов, почему иногда нужно добавлять виртуальное ключевое слово в переопределенную функцию?

Почему я иногда вижу в примерах C++, когда речь идет о подклассах/наследовании, базовый класс имеет виртуальное ключевое слово, а иногда переопределенная функция также имеет виртуальное ключевое слово, почему иногда необходимо добавлять в подкласс виртуальное ключевое слово? Например:

class Base 
{
  Base(){};
  virtual void f()
     ......
  }
};

class Sub : public Base
{
  Sub(){};
  virtual void f()
     ...new impl of f() ...
  }
};

person user63898    schedule 15.03.2011    source источник
comment
Своего рода дубликат stackoverflow.com/questions/4024476/, если я правильно понял.   -  person Kiril Kirov    schedule 15.03.2011
comment
Ссылка, которую предоставляет Satrapes, будет лучшим источником для этого вопроса.   -  person Rainning    schedule 04.06.2018


Ответы (1)


Это не обязательно, но помогает удобочитаемости, если вы видите только определение производного класса.

§10.3 [класс.виртуальный]/3

Если виртуальная функция-член vf объявлена ​​в классе Base и в классе Derived, производном прямо или косвенно от Base, объявлена ​​функция-член vf с тем же именем и тем же списком параметров, что и в Base::vf, то Derived::vf также является виртуальным (независимо от того, объявлено оно так или нет) и переопределяет 97) Base::vf.

Где сноска 97) в основном гласит, что если список аргументов отличается, функция не будет переопределять и не обязательно будет virtual

person David Rodríguez - dribeas    schedule 15.03.2011