Detaillierte Erläuterung des Unterschieds zwischen statischem Polymorphismus und dynamischem Polymorphismus in C++

Inhaltsverzeichnis

1. Konzept und Klassifizierung des Polymorphismus

2. Die Rolle des Polymorphismus

3. Statischer Polymorphismus

4. Dynamischer Polymorphismus

5. Zusammenfassung


1. Konzept und Klassifizierung des Polymorphismus

        Polymorphismus ist ein wichtiges Merkmal der objektorientierten Programmierung (OOP). Polymorphismus bedeutet wörtlich mehrere Zustände. In objektorientierten Sprachen ist eine Schnittstelle mit mehreren Implementierungen Polymorphismus. Polymorphismus in C++ ist in zwei Phasen verkörpert: Kompilierung und Laufzeit. Der Polymorphismus zur Kompilierungszeit ist ein statischer Polymorphismus, und die verwendete Schnittstelle kann zur Kompilierungszeit bestimmt werden. Laufzeitpolymorphismus ist dynamischer Polymorphismus, und die spezifische referenzierte Schnittstelle kann nur zur Laufzeit bestimmt werden.

Bild

        Der Unterschied zwischen statischem Polymorphismus und dynamischem Polymorphismus besteht tatsächlich darin, wann Funktionsimplementierung und Funktionsaufruf zugeordnet werden sollen, sei es zur Kompilierungszeit oder zur Laufzeit, dh ob die Funktionsadresse früh oder spät gebunden wird. Statischer Polymorphismus bedeutet, dass die Aufrufadresse der Funktion während der Kompilierung ermittelt und der Code erstellt werden kann. Dies ist statisch, was bedeutet, dass die Adresse früh gebunden wird. Statischer Polymorphismus wird oft auch als statische Bindung bezeichnet. Dynamischer Polymorphismus bedeutet, dass die Adresse eines Funktionsaufrufs nicht während des Compilers ermittelt werden kann und zur Laufzeit ermittelt werden muss. Es handelt sich um eine späte Bindung. Dynamischer Polymorphismus wird oft auch als dynamische Bindung bezeichnet.


2. Die Rolle des Polymorphismus

        Warum Polymorphismus verwenden? Durch die Kapselung kann Code modularisiert werden, und durch Vererbung kann vorhandener Code erweitert werden. Ihr Zweck ist die Wiederverwendung von Code. Der Zweck des Polymorphismus besteht in der Wiederverwendung von Schnittstellen. Statischer Polymorphismus implementiert dieselbe Schnittstelle auf unterschiedliche Weise und ruft unterschiedliche Implementierungen entsprechend unterschiedlicher übergebener Parameter (unterschiedliche Zahlen oder Typen) auf. Dynamischer Polymorphismus bedeutet, dass die Funktion unabhängig von der übergebenen Objektklasse die von den jeweiligen Objekten implementierten Methoden über dieselbe Schnittstelle aufrufen kann.


3. Statischer Polymorphismus

        Statischer Polymorphismus wird häufig durch Funktionsüberladung und Vorlagen (generische Programmierung) implementiert. Einzelheiten finden Sie im folgenden Code:

#include <iostream>
using namespace std;

//两个函数构成重载
int add(int a, int b)
{
  cout<<"in add_int_int()"<<endl;
  return a + b;
}
double add(double a, double b)
{
  cout<<"in add_double_doube()"<<endl;
  return a + b;
}

//函数模板(泛型编程)
template <typename T>
T add(T a, T b)
{
  cout<<"in func tempalte"<<endl;
  return a + b;
}

int main()
{
  cout<<add(1,1)<<endl;           //调用int add(int a, int b)
  cout<<add(1.1,1.1)<<endl;       //调用double add(double a, double b)
  cout<<add<char>('A',' ')<<endl; //调用模板函数,输出小写字母a
}

        Programmausgabe:

in add_int_int()
2
in add_double_doube()
2.2
in func tempalte
a

4. Dynamischer Polymorphismus

        Die häufigste Verwendung des dynamischen Polymorphismus besteht darin, einen Basisklassenzeiger zu deklarieren, mit dem Zeiger auf ein beliebiges Unterklassenobjekt zu zeigen und die entsprechende virtuelle Funktion aufzurufen. Je nach den verschiedenen Unterklassen, auf die verwiesen wird, können unterschiedliche Methoden aufgerufen werden. Wenn keine virtuellen Funktionen verwendet werden, dh kein C ++ - Polymorphismus, ist die Verwendung des Basisklassenzeigers zum Aufrufen der entsprechenden Funktion immer auf die Basisklassenfunktion selbst beschränkt und kann keine überschriebenen Funktionen in der Unterklasse aufrufen. Da es keinen Polymorphismus gibt, ist die Adresse des Funktionsaufrufs sicher und die feste Adresse ruft immer dieselbe Funktion auf, was den Zweck der „Implementierung einer Schnittstelle und mehrerer Implementierungen“ zunichte macht.

#include <iostream>
using namespace std;

class Base
{
public:
  virtual void func()
{
    cout << "Base::fun()" << endl;
  }
};

class Derived : public Base
{
public:
  virtual void func()
{
   cout << "Derived::fun()" << endl;
  }
};

int main()
{
  Base* b=new Derived;     //使用基类指针指向派生类对象
  b->func();               //动态绑定派生类成员函数func
  
  Base& rb=*(new Derived); //也可以使用引用指向派生类对象
  rb.func();        
}

        Programmausgabe:

Derived::fun()
Derived::fun()

        Aus dem obigen Beispiel ist ersichtlich, dass bei Verwendung eines Basisklassenzeigers oder einer Referenz, um auf ein Unterklassenobjekt zu verweisen, die aufgerufene Funktion eine in der Unterklasse neu geschriebene Funktion ist. Dadurch wird eine dynamische Bindung der Laufzeitfunktionsadresse, dh eine dynamische Bindung, erreicht . . Dynamischer Polymorphismus wird durch „Vererbung + virtuelle Funktion“ erreicht. Nur während der Ausführung des Programms (nicht während der Kompilierung) kann der tatsächliche Typ des referenzierten Objekts ermittelt und die entsprechende Methode entsprechend seinem tatsächlichen Typ aufgerufen werden. Das spezifische Format besteht darin, das Schlüsselwort virtual zu verwenden, um eine Mitgliedsfunktion einer Klasse zu ändern. Dies zeigt an, dass die Funktion eine virtuelle Funktion ist und die abgeleitete Klasse die Mitgliedsfunktion erneut implementieren muss und der Compiler die dynamische Bindung implementiert.


5. Zusammenfassung

        Anmeldeformular:

        Der statische Polymorphismus ist divergent und ermöglicht die Verwendung desselben Implementierungscodes in verschiedenen Situationen.

        Der dynamische Polymorphismus ist konvergent und ermöglicht die Verwendung unterschiedlicher Implementierungscodes in derselben Situation.

        Was das Denken angeht:

        Statischer Polymorphismus ist ein generischer Programmierstil, der Wert auf die Universalität von Algorithmen legt.

        Dynamischer Polymorphismus ist ein objektbasierter Programmierstil, der Wert auf die Trennung von Schnittstellen und Implementierungen legt.


↓↓↓ Für weitere technische Inhalte sowie Bücher und Materialien achten Sie bitte auf „Clear Embedded“ für den technischen Austausch in der Gruppe ↓↓↓ 

Ich denke du magst

Origin blog.csdn.net/helloqusheng/article/details/133100991
Empfohlen
Rangfolge