в C ++ при создании подклассов, почему иногда необходимо добавить виртуальное ключевое слово для переопределенной функции? - PullRequest
23 голосов
/ 15 марта 2011

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

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

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

1 Ответ

31 голосов
/ 15 марта 2011

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

§10.3 [class.virtual] / 3

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

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

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