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.
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% 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.
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:
Ein Hinweis zur Syntax: Die Parser-Regeln für Box * s1;
sind (sehr vereinfacht):
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:
x
ist ein Zeiger auf Box
, aber y
ist ein Box
, da das Parsing folgendes ist:
Tags und Links c++ inheritance types typechecking