Heim > Backend-Entwicklung > C++ > Was ist der Unterschied zwischen virtuellen und rein virtuellen Funktionen in der objektorientierten Programmierung?

Was ist der Unterschied zwischen virtuellen und rein virtuellen Funktionen in der objektorientierten Programmierung?

DDD
Freigeben: 2024-12-26 02:21:10
Original
751 Leute haben es durchsucht

What's the Difference Between Virtual and Pure Virtual Functions in Object-Oriented Programming?

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;
    }
};
Nach dem Login kopieren

Derived.hpp:

struct Derived : public Base {
    void foo() override {
        std::cout << "Derived::Foo" << std::endl;
    }
};
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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
};
Nach dem Login kopieren

PureDerived.hpp:

struct PureDerived : public PureBase {
    void foo() override {
        std::cout << "PureDerived::Foo" << std::endl;
    }
};
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage