Virtualität (3/4)

Welche Funktionen sollen als virtual deklariert werden?

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.