Typeid funktioniert nicht korrekt

7

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

    
user2600393 09.08.2013, 13:32
quelle

3 Antworten

9

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.

    
Shafik Yaghmour 09.08.2013, 15:00
quelle
20

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.

    
Pete Becker 09.08.2013 13:36
quelle
0

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.

    
David Elliman 09.08.2013 14:11
quelle

Tags und Links