Ich kann die typid-Funktion nicht korrekt erhalten. Fehle ich etwas
?Code:
%Vor%Es wird immer gedruckt:
Klasse B Klasse a Klasse A
Ich verwende VS2010 für mein Projekt
Das Objekt, auf das es zeigt, muss polymorph sein, damit es wie erwartet funktioniert. Wenn A
über virtual
Methoden verfügt, würde Ihr Code wie erwartet funktionieren, zum Beispiel einen virtuellen Destruktor hinzufügen, mit dem ich die Demo hier unter Verwendung von gcc .
Zitat aus dem C ++ Entwurfsstan- dard Abschnitt 5.2.8
Typidentifikation Absatz 2 sagt:
Wenn typeid auf einen glvalue-Ausdruck angewendet wird, dessen Typ a ist polymorphe Klassentyp (10.3), das Ergebnis bezieht sich auf ein std :: type_info Objekt, das den Typ des am meisten abgeleiteten Objekts darstellt (1.8) [...]
Was für den Fall gilt, dass wir eine virtual
-Methode haben, in Ihrem Fall haben Sie keinen polymorphen Typ, so dass Absatz 3 gilt:
Wenn typeid auf einen anderen Ausdruck als einen glvalue von a angewendet wird polymorphen Klassentyp, bezieht sich das Ergebnis auf ein std :: type_info-Objekt repräsentiert den statischen Typ des Ausdrucks
Sie erhalten also den static
Typ zurück, der A
ist.
Nur ein wenig vollständiger Abschnitt 10.3
Virtuelle Funktionen sagt:
Virtuelle Funktionen unterstützen dynamische Bindung und objektorientiert Programmierung. Eine Klasse, die eine virtuelle Funktion deklariert oder erbt eine polymorphe Klasse genannt.
Das Problem ist, dass A
keine virtuellen Funktionen hat und daher nicht als polymorpher Typ behandelt wird. Als Ergebnis sucht typeid
den deklarierten Typ des Zeigers, nicht den tatsächlichen Typ des Objekts, auf das er zeigt.
Nachdem Sie darüber nachgedacht haben, während Sie den Rasen mähen ... Ein Zeiger kann nicht wissen, auf welche Art von Objekt er zeigt. Die Typinformation wird mit dem Zeiger gespeichert und dies wird nicht durch Zeigen auf eine abgeleitete Klasse (B) geändert. Sie benötigen also eine Typumwandlung, um den Typ eines Zeigers und die Ausgabe IS wie erwartet zu ändern.