Lassen Sie uns zunächst unseren neuen Wissenspunkt vorstellen – die virtuelle Funktion .
Was ist das für eine Funktion? Vereinfacht ausgedrückt handelt es sich um eine Funktion, die mit virtual vor einer Funktion deklariert wird. Die allgemeine Form ist wie folgt:
Rückgabewert der virtuellen Funktion Funktionsname (formeller Parameter) {Funktionskörper}
Wofür wird es also verwendet? Durch die Entstehung virtueller Funktionen kann zur Laufzeit eine Verbindung zwischen Funktion und Funktionskörper hergestellt werden, die sogenannte dynamische Bindung . Wenn dann die abgeleitete Klasse der virtuellen Funktion ausgeführt wird, kann der Effekt der Ausführung derselben Methode, jedoch mit unterschiedlichen Ergebnissen, entsprechend der dynamischen Bindung zur Laufzeit, dem sogenannten Polymorphismus, erzielt werden. Auf diese Weise gibt es eine Möglichkeit, das Problem im vorherigen Abschnitt zu lösen.
Als nächstes müssen wir nur noch die Bereichsmethode in der Basisklasse als virtuelle Funktion deklarieren, und dann kann jeder Zeiger oder jede Referenz vom Typ Point in der Hauptfunktion fett aufgerufen werden, ohne dass wir uns über Typprobleme Gedanken machen müssen. Weil sie basierend auf dem tatsächlichen Objekttyp entscheiden, welche Methode aufgerufen werden soll, um eine dynamische Bindung zu erreichen.
Der Code lautet wie folgt:
/****************************************//Des: C++-Tutorial-Demo//Autor: Huang/ /Copyright:www.dotcpp.com//Datum:20.12.2017*********************************** *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
Nach der Änderung kompilieren und ausführen:
Bitte experimentieren Sie auf Ihrem eigenen Computer, um die Rolle virtueller Funktionen und Polymorphie kennenzulernen.
Zu beachten sind:
1. Virtuelle Funktionen können keine statischen Mitgliedsfunktionen oder Freundfunktionen sein, da sie nicht zu einem Objekt gehören.
2. Inline-Funktionen können ihren Speicherort während der Laufzeit nicht dynamisch bestimmen. Selbst wenn die virtuelle Funktion innerhalb der Klasse definiert ist, wird sie während der Kompilierung dennoch als nicht inline betrachtet.
3. Der Konstruktor kann keine virtuelle Funktion sein, und der Destruktor kann eine virtuelle Funktion sein und wird normalerweise als virtuelle Funktion deklariert.