Da für die Zuordnung virtueller Funktionen zu ihren Klassen eine umfangreiche Zuordnungstabelle aufgebaut werden muß wird i. allg. geraten mit der Deklaration virtueller Funktionen sparsam umzugehen.
Unbedingt notwendig um einen sicheren Aufruf der Funktionen zu sichern ist es
solche Methoden als virtual zu deklarieren, die
in mehreren abgeleiteten Klassen neu definiert werden und von Methoden
aufgerufen werden, die nicht in all diesen Klassen neu definiert werden.
In anderen Fällen kann die virtual
-Deklaration unterbleiben.
Insbesondere ist in obigen Beispiel eine virtual
-Deklaration für
verschiebe()
unnötig.
Dennoch kann um eine sichere Programmierung zu gewährleisten mit dem
Schlüsselwort virtual
ruhig etwas großzügiger umgegangen werden.
Das Argument des Laufzeit- und Speicherverlustes zieht bloß in einem gewissen
Rahmen. Denn die meiste Zeit wird ein Programm mit anderen Dingen als dem
Aufruf von Methoden, die in mehreren Ableitungen redefiniert werden,
beschäftigt sein.
Eine sichere Strategie ist: Die Methoden, die in keiner Ableitung neu
definiert werden brauchen nicht virtuell deklariert werden. Methoden hingegen,
die in Ableitungen redefiniert werden können durchaus virtuell deklariert
werden, wenn nicht sicher bekannt ist, daß es nie zu falschen Aufrufen
kommen kann. Diese Strategie ist etwas umstritten, aber gerade für unerfahrene
Programmierer ist ein virtual
zu viel allemal besser als eines zu wenig.
Es genügt zwar in einer Basisklasse eine virtual
-Deklaration
durchzuführen und in den hiervon abgeleiteten Klassen dieses Schlüsselwort
wegzulassen -- die Methoden werden automatisch virtuell (Einmal virtuell,
immer virtuell!) --, doch sollte aus
Gründen der Übersichtlichkeit das Schlüsselwort immer erscheinen.