Polymorphismus
Polymorphismus ist eines der wichtigen Merkmale der objektorientierten Programmierung. Die wörtliche Bedeutung kann einfach wie folgt verstanden werden: mehrere Formen, mehrere Erscheinungen. Tatsächlich ist die wesentliche Bedeutung dieselbe. Bei der objektorientierten Programmierung bedeutet dies, dass dieselbe Methode unterschiedliche Ausführungseffekte hat, wenn sie von verschiedenen Objekten ausgeführt wird.
Insbesondere kann die Implementierung von Polymorphismus in zwei Typen unterteilt werden: Polymorphismus zur Kompilierungszeit und Polymorphismus zur Laufzeit. Ersteres ist der spezifische Operationsprozess, der beim Kompilieren bestimmt wird, und letzteres ist der Operationsprozess, der nur während der Ausführung des Programms bestimmt wird. Diese Festlegung des Betriebsablaufs ist verbindlich , auch Bindung genannt.
Die Bindung, die während der Kompilierung und Verbindung bestätigt wird, wird als statische Bindung bezeichnet. Die Funktionsüberladung und Instanziierung von Funktionsvorlagen, die wir zuvor gelernt haben, fällt in diese Kategorie. Die andere besteht darin, zu bestätigen, welcher Code ausgeführt wird, wenn er ausgeführt wird. Dies wird als dynamische Bindung bezeichnet. In diesem Fall kann nicht bestätigt werden, welcher Code beim Kompilieren ausgeführt wird, sondern kann erst bestätigt werden, nachdem das Programm ausgeführt wurde laufen.
Im Vergleich dazu hat die statische Bindung bereits festgelegt, wie sie während der Kompilierung ausgeführt wird, sodass sie effizient ausgeführt werden muss, während die dynamische Bindung langsamer sein muss, ihr Vorteil jedoch in der Flexibilität liegt. Beide haben ihre eigenen Vorzüge und unterschiedliche Nutzungsszenarien.
Im Folgenden geben wir Ihnen ein einfaches Beispiel zur statischen Verlinkung:
/****************************************//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;}doublearea(){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;}
Es sind zwei Klassen definiert, eine Punktklasse und eine abgeleitete Kreisklasse. Sie können den Code der Hauptfunktion und die Ergebnisse der vier Ausgabebereiche sehen.
Sie können den Code vergleichen, um die vier Ausgaben zu verstehen:
Der erste Cout gibt die Fläche von A aus, bei der es sich um die Flächenmethode in der Point-Klasse handelt. Die Fläche ist 0, daher gibt es kein Problem.
Der zweite Cout gibt die Fläche von B aus, bei der es sich offensichtlich um die Flächenmethode der abgeleiteten Klasse Circle handelt. Die Fläche wird natürlich gemäß der Formel berechnet und der Wert beträgt 1256,64, was kein Problem darstellt.
Der dritte Cout gibt die Flächenmethode des Circle-Klassenobjekts aus, auf das der Point-Typzeiger p zeigt. Er gibt 0 aus, was offensichtlich die Flächenmethode in der Point-Klasse ist. Was C++ hier implementiert, ist die statische Bindung, das heißt, beim Kompilieren wird basierend auf dem Typ von p bestimmt, welcher Bereich ausgeführt werden soll, also ist er 0.
Der vierte Cout-Typ funktioniert auf die gleiche Weise. Er weist ein Objekt vom Typ „Kreis“ einer Referenz vom Typ „Punkt“ zu und führt ebenfalls eine statische Bindung durch.
Offensichtlich ist dies nicht das Ergebnis, das wir erwarten. Tatsächlich führen wir lieber die Methoden der tatsächlichen Objekte aus, als die Typen von Zeigern und Referenzen blind zu bestimmen.
Wenn Sie unsere Anforderungen erfüllen möchten, sollten Sie unabhängig vom Typ des Zeigers oder der Referenz eine flexible Entscheidung basierend auf dem tatsächlichen Objekt treffen, auf das gezeigt wird. Dann müssen wir diese standardmäßige statische Bindungsmethode ändern und eine dynamische Bindung verwenden, die zur Laufzeit flexibel festgelegt wird.
Im nächsten Abschnitt werden virtuelle Funktionen für jedermann ausführlich erklärt!