2017-01-08 3 views
0

In meinen Augen, Polymorphie ist etwas anderes für einige Basisklasse Typ zur Laufzeit tun. Wie bei Überlastung ist auch wurde Polymorphismus erste heute zugehört, wie zum Beispiel:?Warum Aufruf Funktion/Methode Überladung als statische Polymorphie in C++?

void A(int a){} 
void A(int a, int b){} 

Warum A statischen Polymorphismus genannt wird Ich frage mich nur, das Konzept.
Gibt es auch eine virtuelle Tabelle?

+4

Nein, es verwendet keine virtuelle Tabelle, da * static * bedeutet, dass es zur Kompilierzeit aufgelöst wird. Der Wikipedia-Artikel zu [Function overloading] (https://en.wikipedia.org/wiki/Function_overloading) faßt es zusammen wie folgt: * "Wenn Sie eine Methode überladen, machen Sie wirklich nur eine Anzahl verschiedener Methoden, die zufällig die gleiche haben Name. "* – UnholySheep

+0

Ich glaube nicht, dass dies ein Beispiel für statische Polymorphie ist. Einige Funktionen Überladung wird als statische Polymorphie verwendet, einige andere Funktion Überladung ist einfach nicht. –

+0

@NickyC, Können Sie ein Beispiel zeigen oder erklären, was die Art von Überladung ist, ist statische Polymorphie? – LoranceChen

Antwort

1

Polymorphie bedeutet, dass der Angerufene entscheidet, wie er vorgeht, wenn er eine Nachricht vom Anrufer erhält.

Denken Sie an eine Nachricht "gehe vorwärts 10 Meter". Wenn der Angerufene eine Person ist, geschieht dies durch Gehen. Wenn der Angerufene ein Auto ist, macht das Auto dies, indem er seine Räder dreht.

Die Idee des Polymorphismus gibt nicht an, welche Sprachmerkmale beteiligt sind oder wann die Entscheidung getroffen werden muss. Wir können es in Runtime tun, mit virtuellen Funktionen. Wir können es in der Kompilierungszeit (statischer Polymorphismus) tun, indem wir Funktionsüberladung, Vorlagen oder sogar böse Präprozessormakros verwenden.

Wenn wir verwenden virtuelle Funktion:

MovableObject* ptr = get_person(); 
ptr->go_forward(10); 

MovableObject* ptr2 = get_car(); 
ptr2->go_forward(10); 

Wenn wir Überladen von Funktionen verwenden:

void go_forward(Person& person, int distance); 
void go_forward(Car& car, int distance); 

Nicht alle Überladen von Funktionen wie Polymorphismus verwendet werden.

Um statische Polymorphie durch Überladung zu demonstrieren, betrachten Sie zwei einfache Programme.

// Program 1 
int a; 
int b; 
std::cin >> a >> b; 
int sum = a + b; 
std::cout << sum; 

// Program 2 
double a; 
double b; 
std::cin >> a >> b; 
double sum = a + b; 
std::cout << sum; 

Warten. Es sieht so aus, als ob es nicht überladen ist, oder?

Eigentlich gibt es Überlastung. Beide Programme beinhalten einen Ausdruck a + b. Beide bedeuten für uns eine Ergänzung. Aber es gibt einen Unterschied: + in Programm 1 ist kompiliert in den Maschinenbefehl ganzzahlige Addition; + in Programm 2 ist kompiliert in Fließkomma-Addition. Beide sind Addition, aber die physikalischen Vorgänge sind sehr unterschiedlich.

Überlastung? Ja, + ist überlastet.

Ist es Polymorphismus? Ja, + bedeutet in beiden Fällen dasselbe für den Aufrufer, und die zugrunde liegenden Vorgänge sind unterschiedlich.

Betrachten Sie nun eine andere Verwendung von +.

// Program 3 
std::string a; 
std::string b; 
std::cin >> a >> b; 
std::string sum = a + b; 
std::cout << sum; 

Programm 3 verwendet + auch. Aber es ist keine Addition mehr. Es ist jetzt String-Verkettung.

Überlastung? Ja, + ist überlastet.

Ist es Polymorphismus? Nein, die Bedeutung ist jetzt anders als bei Programm 1 und 2. Addition und Verkettung sind sehr unterschiedliche Dinge.


Ein anderes Beispiel.

Denken Sie an Standardbibliotheksbehälter.

vector<int> my_vector; 
begin(my_vector); 

list<double> my_list; 
begin(my_list); 

Überlastung? Ja, begin ist überlastet.

Ist es Polymorphismus? Ja, beide Versionen von begin geben einen Iterator zurück, der auf das erste Element zeigt, obwohl die Iteratoren einen anderen Typ haben.

Wie wäre es damit. Eine Klasse, die eine Stoppuhr repräsentiert, und eine Funktion begin beginnen die Zeit zu zählen.

Stopwatch my_watch; 
begin(my_watch); 

Überlastung? Ja, begin ist überlastet.

Ist es Polymorphismus? Dieses Mal nicht. Dieser begin soll keinen Iterator erhalten. Es startet nur die Stoppuhr. Die Bedeutung ist anders, so dass es keine Form von Polymorphismus ist, wenn es mit anderen begin s in Betracht gezogen wird.

+0

Dank so Detail und solche Beispiele, aber ich habe etwas Wunder. Warum Zeichenfolge '+' Operator und 'beginnen (Stoppuhr sw);' ist nicht? sollte der Unterschied von Parameter (n) die gleiche Basisklasse haben, wie zum Beispiel "begin (Iterator param)", obwohl "go_forward" zwei Funktionen hat, aber mit der gleichen wie 'begin' in der Kompilierzeit (so genannte Polymorphie?). Aber '+' war wirklich erstaunlich. – LoranceChen

+0

@LananceChen Es gibt nichts mit der Basisklasse zu tun. Bedeutung zählt. Das Hinzufügen von Ganzzahlen und das Hinzufügen von Fließkommazahlen sind beides Ergänzungen. Aber das Hinzufügen von Zahlen und String-Verkettungen ist nicht dasselbe. –

+0

em ... was ist die "gleiche Sache" basierend auf? – LoranceChen

Verwandte Themen