Ich bin Java-Programmierer und habe vor kurzem begonnen, C++ zu lernen. Ich bin verwirrt von etwas.Warum kann ich keine Polymorphie mit normalen Variablen machen?
Ich verstehe, dass in C++, um polymorphes Verhalten zu erreichen, müssen Sie entweder Zeiger oder Referenzen verwenden. Betrachten Sie beispielsweise eine Klasse Shape
mit einer implementierten Methode getArea()
. Es hat mehrere Unterklassen, die getArea() unterschiedlich überschreiben. Als betrachten Sie die folgende Funktion:
void printArea(Shape* shape){
cout << shape->getArea();
}
Die Funktion ruft die korrekte getArea()
Implementierung, basierend auf den konkreten Shape
der Zeiger auf.
Dies funktioniert genauso:
void printArea(Shape& shape){
cout << shape.getArea();
}
Allerdings ist die folgende Methode polymorphicaly nicht:
void printArea(Shape shape){
cout << shape.getArea();
}
tut, was nicht Materie konkrete Art von Shape
in der Funktion übergeben wird, die gleiche getArea()
Implementierung heißt: der Standard in Shape
.
Ich möchte die technische Begründung dahinter verstehen. Warum funktioniert Polymorphismus mit Zeigern und Referenzen, aber nicht mit normalen Variablen? (Und ich denke, das gilt nicht nur für Funktionsparameter, sondern für alles).
Bitte erläutern Sie die technischen Gründe für dieses Verhalten, um mir zu verstehen.
Dies könnte hilfreich sein. http://stackoverflow.com/questions/7516545/why-is-object-slice-needed-in-c-why-it-is-allowed-for-more-bugs –
Es könnte auch hilfreich sein, das in Java zu wissen Alle Objekte sind tatsächlich Zeiger auf reale Objekte. Wenn Sie also die Klasse Shape haben, kopiert "Shape a = b" intern nur den Zeiger auf das tatsächliche Objekt und inkrementiert seine interne Referenzzahl. Wenn alle Verweise auf ein Objekt nicht mehr vorhanden sind, unterliegt es der Garbage Collection von Java. In C++ können Sie mit den tatsächlichen Objekten spielen. Kopieren Sie sie herum, usw. Deshalb arbeitet Polymorphismus nur mit Zeigern (oder Referenzen, die meistens syntaktische Zucker für Zeiger sind). –
Die Funktion erhält nur eine 'Form'. Wenn Sie einen Subtyp (oder einen anderen Typ) übergeben, wird dieser in eine 'Form' umgewandelt (zugewiesen). – Galik