Простой ответ: если вы хотите, чтобы функции вашего класса были переопределены для полиморфизма во время выполнения, вы должны пометить их как virtual
, а не, если вы не собираетесь этого делать.
Не отмечайтефункции virtual
только потому, что вы чувствуете, что это придает дополнительную гибкость, лучше подумайте о своем дизайне и цели раскрытия интерфейса.Например: если ваш класс не предназначен для наследования, то создание виртуальных функций-членов будет вводить в заблуждение.Хорошим примером этого являются контейнеры стандартной библиотеки, которые не предназначены для наследования и, следовательно, у них нет виртуальных деструкторов.
Нет причин, по которым не следует отмечать все функции-члены как виртуальные, чтобы заключить их в кавычкинекоторые потери производительности, не относящиеся к типу POD и т. д., но если вы действительно хотите, чтобы ваш класс был предназначен для переопределения во время выполнения, то это является его целью, а также устраняет и устраняет так называемые недостатки.