Ключевое слово virtual
должно быть добавлено к функциям базового класса, чтобы сделать их перезаписываемыми.В вашем примере struct A
является базовым классом.virtual
ничего не значит для использования этих функций в производном классе.Однако, если вы хотите, чтобы ваш производный класс также являлся самим базовым классом, и вы хотите, чтобы эта функция была перезаписываемой, тогда вам придется поместить туда virtual
.
struct B : public A {
virtual void hello() { ... }
};
struct C : public B {
void hello() { ... }
};
Здесь C
наследуется от B
, поэтому B
не является базовым классом (это также производный класс), а C
является производным классом.Диаграмма наследования выглядит следующим образом:
A
^
|
B
^
|
C
Таким образом, вы должны поместить virtual
перед функциями внутри потенциальных базовых классов, которые могут иметь детей.virtual
позволяет вашим детям отменять ваши функции.Нет ничего плохого в том, чтобы поместить virtual
перед функциями внутри производных классов, но это не обязательно.Тем не менее, рекомендуется, потому что, если кто-то захочет наследовать от вашего производного класса, он не будет рад, что переопределение метода не работает должным образом.
Так что ставьте virtual
перед функциями во всехклассы, участвующие в наследовании, если только вы точно не знаете, что в классе не будет детей, которым нужно было бы переопределять функции базового класса.Это хорошая практика.