У меня была дискуссия с моими коллегами относительно того, следует ли префикс переопределенных методов с помощью ключевого слова virtual или только в исходном базовом классе.
Я склонен префикс всех виртуальных методов (т.е. методов, связанных с поиском vtable) с ключевым словом virtual. Мое логическое обоснование трижды:
-
Учитывая, что в С++ отсутствует переопределение ключевое слово, наличие виртуального ключевое слово по меньшей мере уведомляет вас о том, что метод включает поиск и теоретически можно было бы переопределить дальнейшие специализации или могут быть вызываемый через указатель на более высокий базовый класс.
-
Последовательно используя этот стиль означает, что, когда вы видите метод (по крайней мере, внутри нашего кода) без ключевое слово virtual, вы можете изначально предполагают, что это не полученных из базы или специализированных в подклассе.
-
Если через некоторую ошибку виртуальные удалены из IFoo, все дети будут по-прежнему функционировать (CFooSpecialization:: DoBar будет все еще переопределяют CFooBase:: DoBar, а не просто скрывать его).
Аргумент против практики, как я понял, был: "Но этот метод не является виртуальным" (который, я считаю, недействителен и проистекает из непонимания виртуальности) и "Когда я вижу виртуальное ключевое слово, Я ожидаю, что это означает, что кто-то вытекает из этого, и ищите их".
Гипотетические классы могут быть распределены по нескольким файлам, и существует несколько специализаций.
class IFoo {
public:
virtual void DoBar() = 0;
void DoBaz();
};
class CFooBase : public IFoo {
public:
virtual void DoBar(); // Default implementation
void DoZap();
};
class CFooSpecialization : public CFooBase {
public:
virtual void DoBar(); // Specialized implementation
};
Стилистически ли вы удалили бы ключевое слово virtual из двух производных классов? Если да, то почему? Что такое мысли о переполнении стека?