Virtuelle und rein virtuelle Funktionen verstehen
Virtuelle Funktionen spielen eine entscheidende Rolle in der objektorientierten Programmierung, indem sie Laufzeitpolymorphismus ermöglichen. Gemäß der Definition von Wikipedia ist eine virtuelle Funktion eine überschreibbare Methode oder Funktion, die einen dynamischen Versand ermöglicht. Dies bedeutet, dass die spezifische auszuführende Funktion basierend auf dem Objekttyp zur Laufzeit und nicht zur Kompilierungszeit bestimmt wird.
Im Gegensatz zu nicht-virtuellen Funktionen wird eine virtuelle Funktion in einer abgeleiteten Klasse überschrieben , wird die in der am häufigsten abgeleiteten Klasse definierte Version in der gesamten Klassenhierarchie verwendet. Dadurch wird sichergestellt, dass immer die spezifischste Implementierung der Funktion verwendet wird.
Reine virtuelle Funktionen, auch rein virtuelle Methoden genannt, führen dieses Konzept weiter. Dabei handelt es sich um virtuelle Funktionen, die in einer abgeleiteten Klasse implementiert werden müssen, wenn diese Klasse nicht abstrakt ist. Daher erfordert eine rein virtuelle Funktion effektiv das Vorhandensein eines bestimmten Verhaltens in abgeleiteten Klassen.
Abstrakte Klassen sind solche, die eine oder mehrere rein virtuelle Funktionen enthalten. Solche Klassen können nicht direkt instanziiert werden; Stattdessen muss eine abgeleitete Klasse verwendet werden, die Implementierungen für alle rein virtuellen Funktionen bereitstellt.
Um die Unterschiede zwischen virtuellen und rein virtuellen Funktionen zu veranschaulichen, betrachten Sie das folgende C Code:
Base.hpp:
struct Base { virtual ~Base() = default; virtual void foo() { std::cout << "Base::Foo" << std::endl; } };
Derived.hpp:
struct Derived : public Base { void foo() override { std::cout << "Derived::Foo" << std::endl; } };
main .cpp:
int main() { Base base; base.foo(); // Calls Base::Foo Derived derived; derived.foo(); // Calls Derived::Foo Base* derived_as_base = &derived; derived_as_base->foo(); // Calls Derived::Foo (due to dynamic dispatch) }
In diesem Code enthält die Basisklasse eine virtuelle Funktion foo, die „Base::Foo“ ausgibt. Die Derived-Klasse überschreibt diese Funktion, um „Derived::Foo“ auszugeben. Wenn ein Basisobjekt foo aufruft, lautet die Ausgabe „Base::Foo“. Wenn jedoch ein abgeleitetes Objekt (auf das als Basiszeiger zugegriffen wird) foo aufruft, lautet die Ausgabe aufgrund des dynamischen Versands „Derived::Foo“.
Betrachten wir nun ein rein virtuelles Objekt Funktion:
PureBase.hpp:
struct PureBase { virtual ~PureBase() = default; virtual void foo() = 0; // Pure virtual function };
PureDerived.hpp:
struct PureDerived : public PureBase { void foo() override { std::cout << "PureDerived::Foo" << std::endl; } };
In diesem Code Die PureBase-Klasse enthält eine rein virtuelle Funktion foo, die in der Basisklasse nicht definiert ist. Daher ist die PureBase-Klasse abstrakt, da ihr eine vollständige Implementierung fehlt.
PureMain.cpp:
int main() { // error: cannot declare variable 'pureBase' to be of abstract type 'PureBase' // PureBase pureBase; // pureBase.foo(); PureDerived pureDerived; pureDerived.foo(); // Calls PureDerived::Foo }
In diesem Beispiel wird versucht, eine PureBase zu instanziieren Objekt führt direkt zu einem Compilerfehler. Das Erstellen eines PureDerived-Objekts ist jedoch zulässig, da es eine Implementierung für die foo-Funktion bereitstellt.
Zusammenfassend lässt sich sagen, dass virtuelle Funktionen einen dynamischen Versand ermöglichen und in abgeleiteten Klassen überschrieben werden können. Rein virtuelle Funktionen hingegen müssen in abgeleiteten Klassen implementiert werden und bestimmte Verhaltensweisen erzwingen. Zusammengenommen spielen diese Konzepte eine entscheidende Rolle bei der Ermöglichung polymorpher Funktionalität in der objektorientierten Programmierung.
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen virtuellen und rein virtuellen Funktionen in der objektorientierten Programmierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!