Heim > php教程 > PHP开发 > Vertiefte Kenntnisse der Anwendung dynamischer Bindung und statischer Bindung in C++

Vertiefte Kenntnisse der Anwendung dynamischer Bindung und statischer Bindung in C++

高洛峰
Freigeben: 2016-12-26 16:21:18
Original
1107 Leute haben es durchsucht

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

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

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();
Nach dem Login kopieren
Aus der obigen Analyse ist ersichtlich, dass die Aufrufe pD->vfun() und pB->vfun() beide Funktionen D::vfun() sind, aber was sind ihre Standardparameter?
Analyse: Bei pD->vfun() ist der statische Typ von pD D*, daher sollte der Standardparameter 20 sein; pB->vfun Der Standardparameter für ( ) sollte 10 sein. Ich habe den Code geschrieben und überprüft, und er ist korrekt.
Ich denke, diese Funktion wird niemandem gefallen. Denken Sie also immer daran:
„Definieren Sie niemals den geerbten Standardparameterwert einer Funktion neu.“
Über die C++-Sprache
Derzeit beschäftige ich mich grundsätzlich mit C++ und arbeite unter der Teilmenge „objektorientierte Programmierung“. Ich weiß nicht viel über komplexeres Wissen. Dennoch gibt es bereits jetzt beim Programmieren viele Dinge zu beachten, und in Zukunft wird es möglicherweise noch mehr geben. Dies ist möglicherweise der Grund, warum viele Menschen gegen C++ sind.

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!

Verwandte Etiketten:
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 Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage