C++-Lernprotokoll – virtuelle Funktion

Erklären Sie die Funktion und das Prinzip der virtuellen Funktion, den Unterschied zwischen rein virtueller Funktion und virtueller Funktion.


1. Virtuelle Funktionen

        Sehen Sie sich zuerst den folgenden Codeabschnitt an, erstellen Sie zuerst zwei Klassen, eine ist Hund, die andere ist Katze, sie haben ein gemeinsames Attribut: Run. In der Definition muss jedes Tier eine Klasse erstellen, was umständlich ist, daher können wir sie im folgenden Beispiel vereinfachen.

#include <iostream>
using namespace std;

class Dog{
public:
    void Run(){
        cout<<"Dog->Run"<<endl;
    }    
};

class Cat{
    
public:
    void Run(){
        cout<<"Cat->Run"<<endl;
    }
};

int main()
{
    Dog d;
    d.Run();
    
    Cat c;
    c.Run();

    return 0;
}


        Hier werden Polymorphismus und virtuelle Funktionen verwendet, während Animal eine einheitliche Schnittstelle für die Verwendung von Unterklassen bietet.Obwohl der Code umständlich ist, verbessert er die Skalierbarkeit und Flexibilität des gesamten Projekts.

        Fügen Sie das Schlüsselwort virtual vor der gewöhnlichen Funktion hinzu, um eine virtuelle Funktion zu bilden.Die Unterklasse muss die virtuelle Funktion der übergeordneten Klasse umschreiben, sodass sie beim Aufruf die virtuelle Funktion Run der übergeordneten Klasse überschreibt, um Run of auszuführen die Unterklasse.

#include <iostream>
using namespace std;

class Animal{
public:
    virtual void Run(){
        cout<<"Animal->Run"<<endl;
    }
};

class Dog :public Animal{
public:
    void Run(){
        cout<<"Dog->Run"<<endl;
    }    
};

class Cat:public Animal{
public:
    void Run(){
        cout<<"Cat->Run"<<endl;
    }
};

int main()
{
    Animal *ani;
    ani = new Dog;
    ani->Run();
    delete ani;
    
    ani = new Cat;
    ani->Run();
    delete ani;
    
    return 0;
}

Das Ergebnis ist wie folgt:

   

 

         Hier müssen Sie also nur die Richtung von ani ändern, um verschiedene Methoden zu implementieren. Wenn es keine virtuelle Funktion gibt, was passiert, wenn Sie das Schlüsselwort virtual aus der Klasse Animal entfernen?Offensichtlich implementieren sie standardmäßig die Methode der übergeordneten Klasse Run.

class Animal{
public:
    void Run(){
        cout<<"Animal->Run"<<endl;
    }
};

 

        Die Einführung virtueller Funktionen dient also dazu, einen dynamischen Polymorphismus zu erreichen, der auf verschiedene Unterklassen zeigt, um verschiedene Methoden zu implementieren.

2. Der Unterschied zwischen virtueller Funktion und rein virtueller Funktion

       Da die Funktion der Elternklasse nichts kann, kann sie hier direkt gleich 0 sein, also die rein virtuelle Funktion realisieren.

//虚函数
class Animal{
public:
    virtual void Run(){
        cout<<"Animal->Run"<<endl;
    }
};
//纯虚函数
class Animal{
public:
    virtual void Run()=0;
};

        Der Unterschied zwischen einer virtuellen Funktion und einer rein virtuellen Funktion:

        Eine rein virtuelle Funktion ist nur eine Schnittstelle, die nur von Unterklassen verwendet werden kann, um die Implementierungsmethode zu überschreiben. Die virtuelle Funktion kann in ihr auch die Funktion der Elternklasse implementieren. Sie müssen nur auf die Methode der übergeordneten Klasse zeigen.

        Zusammenfassung: Die virtuelle Funktion darf nicht in der Unterklasse neu geschrieben werden, aber die reine virtuelle Funktion muss in der Unterklasse implementiert werden. Wenn die Run-Methode in der Unterklasse entfernt wird und nur die reine virtuelle Funktion in der übergeordneten Klasse verbleibt, dann der Compiler It einen Fehler melden, können Sie es hier versuchen.

3. Dynamischer Polymorphismus

       Was ist die interne Struktur von Animal? Es gibt einen virtuellen Funktionszeiger (vfptr) und eine virtuelle Funktionstabelle (vftable). Der Zeiger (vfptr) zeigt auf die virtuelle Funktionstabelle, und die Adresse der virtuellen Funktion wird in der virtuellen Funktionstabelle (vftable) aufgezeichnet, d. h. die Adresse der Run-Funktion.

         Wenn der Hund der Unterklasse die Elternklasse erbt, wird auch die virtuelle Funktionstabelle der Elternklasse entsprechend geerbt, und die Unterklasse wird auch eine Kopie speichern, die dieselbe wie die Elternklasse ist.

        Notiz! Wenn zu diesem Zeitpunkt ein Umschreiben auftritt, das heißt, die Unterklasse die virtuelle Funktion der Elternklasse neu schreibt, überschreibt die virtuelle Funktionstabelle der Unterklasse die von der Elternklasse geerbte virtuelle Funktionstabelle. Aber die virtuelle Funktionstabelle der Elternklasse ändert sich nicht.

        Polymorphismus tritt auf, wenn ein Zeiger oder eine Referenz einer Oberklasse auf ein Objekt einer Unterklasse zeigt.

        Der folgende Code zeigt auf Dog, sodass er zur virtuellen Funktionstabelle von Dog geht, um die entsprechende Funktion zu finden, und während der Ausführungsphase tritt dynamischer Polymorphismus auf.

    Animal *ani;
    ani = new Dog;
    ani->Run();

Supongo que te gusta

Origin blog.csdn.net/qq_53734051/article/details/126465524
Recomendado
Clasificación