Was ist eine virtuelle Funktion?
Eine virtuelle Funktion ist eine in einer Oberklasse definierte Funktion, die in einer Unterklasse vorhanden sein muss, damit diese Unterklasse eine vollständige Klassendefinition hat. Virtuelle Funktionen basieren auf einem objektorientierten Programmierparadigma, das als virtuelle Vererbung bezeichnet wird und in C ++ am häufigsten mit dem Schlüsselwort "virtual" verwendet wird. Um eine virtuelle Funktion zu definieren, sind zwei Klassen erforderlich, eine Oberklasse und eine Unterklasse. In der Oberklasse wird die Funktion zuerst deklariert und möglicherweise definiert. In der Unterklasse wird die Funktion definiert - oder überschrieben, je nachdem, ob die Funktion in der Oberklasse definiert wurde.
Die virtuelle Funktion kann auf zwei Arten definiert werden. Erstens kann es als ein Stummel definiert werden, in dem es einen leeren Körper hat und nichts tut. Zweitens könnte es als reine virtuelle Funktion definiert werden, wobei es in der Header-Datei der Superklasse als NULL definiert ist.
Beide Methoden haben Vor- und Nachteile. Durch das Definieren einer Funktion als Stub wird sichergestellt, dass alle Unterklassen implementiert sind, auch wenn sie nichts tun. Wenn man vergisst, die Funktion zu überschreiben und sie ordnungsgemäß in einer Unterklasse zu implementieren, werden jedoch keine Fehler oder Warnungen angezeigt, die darauf hinweisen. Das Definieren einer reinen virtuellen Funktion erfordert andererseits, dass jede Unterklasse ihre eigene Definition der Funktion hat, und es treten Fehler auf, wenn dies nicht der Fall ist.
Virtuelle Funktionen unterliegen jedoch denselben Vererbungsregeln wie nicht-virtuelle Funktionen, sodass Vererbungshierarchien mit mehr als zwei Ebenen möglicherweise keine expliziten Definitionen von virtuellen Funktionen erfordern. Beispielsweise kann man eine Klasse A betrachten, die eine virtuelle Funktion deklariert, die in Unterklasse B implementiert ist. Klasse B hat eine eigene Unterklasse, Klasse C. Klasse C erfordert keine explizite Definition der Funktion von Klasse A, da sie erbt die Definition aus Klasse B. Falls erforderlich, könnte Klasse C die Funktion von Klasse B außer Kraft setzen, oder sie könnte die Funktion von Klasse B außer Kraft setzen, während sie diese auch aufruft.
Andererseits müssen virtuelle Funktionen nicht in einer Unterklasse definiert werden, wenn sie in dieser Unterklasse als virtuell deklariert werden. Zum Beispiel kann man eine Klasse A betrachten, die eine virtuelle Funktion deklariert und zwei Unterklassen hat, B und C. Außerdem könnte man sich vorstellen, dass die Klasse B die Unterklassen D und E und die Unterklasse C die Unterklassen F und G hat.
Für alle Klassen B bis G muss die virtuelle Funktion von Klasse A irgendwie definiert sein. Wenn die Klasse B eine Implementierung der Funktion von A enthält, müssen die Klassen D und E nicht erneut erstellt werden. Vielleicht müssen die Unterklassen von C die Funktion von A implementieren, aber beide tun etwas anderes, daher wäre es nicht sinnvoll, die Funktion in Klasse C selbst zu definieren. In diesem Fall kann die Funktion in Klasse C als virtuell deklariert werden, und eine Implementierung ist nicht erforderlich.
Virtuelle Funktionen können entmutigend zu erlernen sein, aber bei richtiger Verwendung können sie die Codeduplizierung verringern und das Verständnis des Codes allgemein erleichtern. Es gibt jedoch viele Fallstricke bei virtuellen Funktionen, insbesondere bei der Mehrfachvererbung. Bei der Mehrfachvererbung kann es zu Konflikten zwischen mehrdeutig definierten virtuellen Funktionen kommen, weshalb sie in diesem Zusammenhang mit Vorsicht verwendet werden sollten.