Vererbung - warum ist das illegal?

8

Ich mache ein C ++ Quiz. Und es kam der folgende Code - es ist illegal, aber ich kann nicht verstehen, warum. Kann jemand erklären, warum diese Zeile:

%Vor%

erzeugt den Compilerfehler, "kann nicht von Shape * in Box konvertiert werden"? Ich nahm an, dass s1->duplicate() Box::duplicate() aufruft, weil s1 tatsächlich auf ein Box zeigt - aber aus dem Compilerfehler sieht es so aus, als würde es Shape::duplicate() aufrufen.

%Vor%     
BeeBand 15.08.2012, 21:14
quelle

3 Antworten

8

Shape::duplicates() gibt Shape* zurück, was kein Box* ist. Der tatsächlich zurückgegebene Laufzeittyp hat damit nichts zu tun. Wie könnte der Compiler wissen, dass die zurückgegebene Shape* tatsächlich auf eine Box zeigt?

Bearbeiten: Denken Sie darüber nach:

%Vor%     
Luchian Grigore 15.08.2012, 21:17
quelle
15

C ++ Sprache ist statisch getippt. Die Entscheidungen über die Rechtmäßigkeit Ihres Anrufs werden zum Zeitpunkt der Kompilierung getroffen. Der Compiler kann natürlich nicht wissen, dass s1->duplicate() einen Zeiger auf ein Objekt Box zurückgibt. Unter diesen Umständen wäre es unlogisch zu erwarten, dass Ihr Code akzeptiert wird.

Ja, s1->duplicate() ruft in Ihrem Beispiel tatsächlich Box::duplicate auf, aber wie erwartet der Compiler das? Man kann sagen, dass es "offensichtlich" von Ihrem spezifischen Beispiel ist, aber die Spezifikation dieses Sprachmerkmals macht keine Ausnahme für solche "offensichtlichen" Fälle.

    
AnT 15.08.2012 21:17
quelle
1

Aus genau demselben Grund

%Vor%

kompiliert nicht. Dem Compiler ist es egal, dass sich s1 auf ein Box bezieht, noch sollte es das interessieren.

Wenn Sie wissen, dass sich s1 auf Box bezieht, sagen Sie es einfach:

%Vor%

Ein Hinweis zur Syntax: Die Parser-Regeln für Box * s1; sind (sehr vereinfacht):

%Vor%

so ist das Parsen:

%Vor%

und die Gruppierung ist Box (* (s1) )

Es wird als bester Stil betrachtet, Box *s1; zu schreiben, weil er konsistenter mit dem Parsing ist als Box* s1; Wenn Sie mehr als eine Variable in einer Deklaration deklarieren, kann die Syntax Box* verwirrend sein:

%Vor%

x ist ein Zeiger auf Box , aber y ist ein Box , da das Parsing folgendes ist:

%Vor%     
curiousguy 16.08.2012 00:12
quelle