Sie müssen nicht virtuell markiert werden.
Ich würde damit anfangen zu argumentieren, dass virtuelle Werbung für Leser, die Sie erwarten, dass abgeleitete Klassen die virtuelle überschreiben, etwas Nützliches zu tun. Wenn Sie das Virtuelle implementieren, um etwas zu tun, dann hat die virtuelle Methode vielleicht nichts damit zu tun, was Ihre Klasse ist: In diesem Fall ist es albern, sie zu markieren. betrachten:
class CommsObject {
virtual OnConnect();
virtual OnRawBytesIn();
};
class XMLStream : public CommsObject {
virtual OnConnect();
OnRawBytesIn();
virtual OnXMLData();
};
In diesem Beispiel wird OnConnect als virtuelle in beiden Klassen dokumentiert, weil es Sinn macht, dass ein Nachkomme würde immer wissen will. OnRawBytesIn ist nicht sinnvoll, um aus XMLStream zu "exportieren", da es Rohdaten verarbeitet und geparste Daten generiert, die es über OnXMLData() benachrichtigt.
Nachdem ich das alles getan habe, würde ich dann argumentieren, dass der Betreuer einer dritten Klasse, XMLStream betrachtend, denken könnte, dass es "sicher" wäre, ihre eigene OnRawBytes-Funktion zu erstellen und zu erwarten, dass sie normal überlastet funktioniert Funktion - dh die Basisklasse würde die interne richtige aufrufen, und die äußere würde die internen OnRawBytes maskieren.
Das Auslassen des virtuellen Systems hat daher wichtige Details von den Benutzern der Klasse verborgen und den Code auf unerwartete Weise verändert.
So ist der Kreis voll: Versuchen Sie nicht, ihn als Hinweis auf den Verwendungszweck einer Funktion zu verwenden - verwenden Sie ihn als Hinweis auf das Verhalten der Funktion: Markieren Sie Funktionen virtuell konsistent, also nachgeschaltete Programmierer Lesen Sie weniger Dateien, um zu wissen, wie sich eine Funktion beim Überschreiben verhält.
Es sei denn, es wird als Teil einer Bibliothek verwendet. –