No es necesario marcarlos como virtuales.
Comenzaría argumentando que los anunciantes virtuales a los lectores esperan que las clases derivadas anulen las virtuales para hacer algo útil. Si está implementando lo virtual para hacer algo, entonces el método virtual podría no tener nada que ver con el tipo de cosa que es su clase: en cuyo caso, marcarlo virtual es una tontería. tener en cuenta:
class CommsObject {
virtual OnConnect();
virtual OnRawBytesIn();
};
class XMLStream : public CommsObject {
virtual OnConnect();
OnRawBytesIn();
virtual OnXMLData();
};
En ese ejemplo, OnConnect se documenta como virtual en ambas clases porque tiene sentido que un descendiente siempre querría saber. OnRawBytesIn no tiene sentido para "Exportar" desde XMLStream, ya que usa eso para manejar bytes sin formato, y generar datos analizados, que notifica a través de OnXMLData().
Habiendo hecho todo eso, entonces argumentaría que el mantenedor de una tercera clase, mirando XMLStream, podría pensar que sería "seguro" crear su propia función OnRawBytes y esperar que funcione como una sobrecarga normal función - es decir, la clase base llamaría a la correcta interna, y la externa enmascararía los OnRawBytes internos.
omitiendo lo virtual ha ocultado detalles importantes de los consumidores de la clase e hizo que el código se comporte de forma inesperada.
Ha terminado el ciclo completo: no intente utilizarlo como una pista sobre el propósito de una función. HÁGALO como una pista sobre el funcionamiento de la función: marque las funciones virtuales de forma consistente para que los programadores posteriores tengan que lea menos archivos para saber cómo se comportará una función cuando se invalide.
A menos que se vaya a utilizar como parte de una biblioteca. –