Um den Polymorphismus von C++ zu unterstützen, werden dynamische Bindung und statische Bindung verwendet. Wenn Sie ihre Unterschiede verstehen, können Sie den Polymorphismus besser verstehen und Fehler beim Programmieren vermeiden.
Sie müssen vier Substantive verstehen:
1. Statischer Objekttyp: der vom Objekt verwendete Typ, wenn es deklariert wird. Es wird zur Kompilierzeit bestimmt.
2. Dynamischer Objekttyp: der Typ des Objekts, auf das aktuell verwiesen wird. Sie wird zur Laufzeit ermittelt. Der dynamische Typ eines Objekts kann geändert werden, der statische Typ kann jedoch nicht geändert werden.
Sehen Sie sich zum statischen Typ und dynamischen Typ von Objekten ein Beispiel an:
class B { } class C : public B { } class D : public B { } D* pD = new D();//pD的静态类型是它声明的类型D*,动态类型也是D* B* pB = pD;//pB的静态类型是它声明的类型B*,动态类型是pB所指向的对象pD的类型D* C* pC = new C(); pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C*
3. Statische Bindung: Was gebunden ist, ist der statische Typ des Objekts (z Die statische Typisierung erfolgt zur Kompilierungszeit.
4. Dynamische Bindung: Was gebunden ist, ist der dynamische Typ des Objekts. Eine bestimmte Funktion (z. B. eine Funktion) hängt vom dynamischen Typ des Objekts ab und tritt während der Laufzeit auf.
class B { void DoSomething(); virtual void vfun(); } class C : public B { void DoSomething();//首先说明一下,这个子类重新定义了父类的no-virtual函数,这是一个不好的设计,会导致名称遮掩;这里只是为了说明动态绑定和静态绑定才这样使用。 virtual void vfun(); } class D : public B { void DoSomething(); virtual void vfun(); } D* pD = new D(); B* pB = pD;
Lassen Sie uns einen Blick darauf werfen: Rufen pD->DoSomething() und pB->DoSomething() dieselbe Funktion auf?
Nein, obwohl pD und pB beide auf dasselbe Objekt zeigen. Da es sich bei der Funktion DoSomething um eine nicht-virtuelle Funktion handelt, ist sie statisch gebunden, d. h. der Compiler wählt die Funktion zur Kompilierungszeit basierend auf dem statischen Typ des Objekts aus. Der statische Typ von pD ist D*, daher verweist der Compiler bei der Verarbeitung von pD->DoSomething() auf D::DoSomething(). Ebenso ist der statische Typ von pB B*, dann ruft pB->DoSomething() B::DoSomething() auf.
Lassen Sie uns noch einmal einen Blick darauf werfen: Rufen pD->vfun() und pB->vfun() dieselbe Funktion auf?
Ja. Da vfun eine virtuelle Funktion ist, ist sie dynamisch gebunden, was bedeutet, dass sie an den dynamischen Typ des Objekts gebunden ist. Obwohl pB und pD unterschiedliche statische Typen haben, zeigen sie gleichzeitig auf ein Objekt und ihre dynamischen Typen sind es das gleiche. ist D*, also rufen sie die gleiche Funktion auf: D::vfun().
Die oben genannten Punkte gelten alle für Objektzeiger und das Gleiche gilt für Referenzen.
Die dynamischen und statischen Typen von Zeigern und Referenzen sind möglicherweise inkonsistent, aber die dynamischen und statischen Typen von Objekten sind konsistent.
D D;
D.DoSomething() und D.vfun() rufen immer D::DoSomething() und D::vfun() auf.
Was die Dinge betrifft, die dynamisch gebunden sind, und diejenigen, die statisch gebunden sind, gibt es einen Artikel, der es sehr gut zusammenfasst:
Ich habe es in einem Satz zusammengefasst: Nur virtuelle Funktionen verwenden dynamische Bindung, und alles andere ist es Statische Bindung. Bisher habe ich nichts gefunden, was nicht auf diesen Satz zutrifft. Wenn es einen Fehler gibt, hoffe ich, dass Sie ihn darauf hinweisen können.
Etwas, das besondere Aufmerksamkeit erfordert
Wenn Standardparameter und virtuelle Funktionen zusammen angezeigt werden, ist die Situation etwas kompliziert und es kann leicht zu Fehlern kommen. Wir wissen, dass virtuelle Funktionen dynamisch gebunden sind, aber aus Gründen der Ausführungseffizienz sind Standardparameter statisch gebunden.
class B { virtual void vfun(int i = 10); } class D : public B { virtual void vfun(int i = 20); } D* pD = new D(); B* pB = pD; pD->vfun(); pB->vfun();
C++ ist eine der vier offiziellen Sprachen von Google. Allerdings hat Google in den letzten Jahren tatsächlich die Go-Sprache eingeführt, und ihre Positionierung ähnelt c/c++. Angesichts dieser Situation denke ich, dass sich die Google-Programmierer möglicherweise der Komplexität von C++ bewusst sind und daher eine alternative Sprache zu C++ entwickeln möchten. Wenn Sie Zeit haben, sollten Sie sich mit der Go-Sprache vertraut machen und sehen, wie sie Entscheidungen zu Themen wie C++ trifft.
Für ein tieferes Verständnis der Anwendung der dynamischen Bindung und der statischen Bindung in C++ beachten Sie bitte die verwandte Artikel auf der chinesischen PHP-Website!