Цитировать стандарт C ++ (10.3.2):
Если виртуальная функция-член vf
объявлена в классе Base
и в классе Derived
, полученном прямо или косвенно из Base
, функция-член vf
с тем же именем и тем же списком параметров поскольку Base::vf
объявлено, то Derived::vf
также является виртуальным (независимо от того, объявлено оно или нет), и оно переопределяет Base::vf
.
Вы можете подытожить это следующим образом: «один раз виртуальный, всегда виртуальный». Однако вы все равно можете добавить модификатор virtual
к переопределяющим функциям-членам, чтобы дать понять пользователю, что класс полиморфен.