Нет необходимости помечать их как виртуальные.
Я бы начал с аргумента, что виртуальная реклама сообщает читателям, что вы ожидаете, что производные классы переопределят виртуальные, чтобы сделать что-то полезное.Если вы реализуете виртуальную систему, чтобы что-то сделать, то виртуальный метод может не иметь ничего общего с тем, чем занимается ваш класс: в этом случае маркировка виртуальной среды глупа.рассмотрим:
class CommsObject {
virtual OnConnect();
virtual OnRawBytesIn();
};
class XMLStream : public CommsObject {
virtual OnConnect();
OnRawBytesIn();
virtual OnXMLData();
};
В этом примере OnConnect задокументирован как виртуальный в обоих классах, потому что имеет смысл, что потомок всегда хотел бы знать.OnRawBytesIn не имеет смысла «экспортировать» из XMLStream, поскольку он использует его для обработки необработанных байтов и генерации проанализированных данных - о чем он уведомляет с помощью OnXMLData ().
Сделав все это, я бы поспорилчто сопровождающий 3-го класса, глядя на XMLStream, может подумать, что было бы «безопасно» создать свою собственную функцию OnRawBytes и ожидать, что она будет работать как обычная перегруженная функция, то есть базовый класс будет вызывать внутреннюю правильную функцию, ивнешний мог бы замаскировать внутренние OnRawBytes.
Таким образом, пропуск виртуальной памяти скрыл важные детали от потребителей класса и заставил код вести себя неожиданным образом.
Итак, я прошел полный круг: ДонНе пытайтесь использовать его как подсказку о предполагаемом назначении функции - НЕ используйте его как подсказку о поведении функции: помечайте функции виртуально, чтобы программисты нижнего уровня должны были читать меньше файлов, чтобы знать, как собирается функциявести себя при переопределении.