In C++ haben einfache alte Daten (POD) keine Informationen zum Laufzeittyp. Die beschriebenen Klassen nehmen genau 1 Byte ein und haben in jedem Compiler mit der leeren Basisklassenoptimierung identische Laufzeitdarstellungen.
So was Sie wollen, kann nicht getan werden.
Das Hinzufügen eines virtuellen Destruktors zur Basisklasse wird in RTTI und dynamic_cast
unterstützt.
Das Hinzufügen eines enum
oder int
Feldes zu der Basis, die für jede abgeleitete Klasse unterschiedlich initialisiert wird, funktioniert auch.
Eine weitere Option ist es, eine Template-Funktion zu erstellen, und einen Zeiger darauf speichern, etwa so:
using my_type_id=void(*)();
template<class>void get_my_type_id_helper(){};
template<class T> my_type_id get_my_type_id(){return get_my_type_id_helper<T>;}
und dann in geeigneter Weise ein my_type_id
in A
initialisiert zu speichern. Dadurch wird RTTI neu erfunden, und wenn Sie mehr Funktionen benötigen, werden Sie C++ RTTI-Overhead anwenden.
In C++ zahlen Sie nur für das, wonach Sie fragen: Sie können nach Klassen ohne RTTI fragen, was Sie getan haben, und es bekommen.
RTTI ist Laufzeittyp Information. POD ist einfache alte Daten, ein C++ 03 Begriff. Viele Klassen sind kein POD: Der einfache Weg besteht darin, einen Destruktor virtual
hinzuzufügen. C++ 11 hat feinkörnigere Standardlayout- und Aggregatbegriffe.
Technisch sind RTTI und POD keine Gegensätze: Es gibt Klassen ohne RTTI, die nicht POD sind.
Beachten Sie, dass MSVC Optionen hat, RTTI nicht zu erzeugen und seine aggressive Comdat-Faltung kann die manuelle RTTI, die ich oben gemacht habe, brechen, in beiden Fällen in Verletzung des Standards.
Fragen Sie nach 'dynamic_cast <>'? Das ist nicht C++ 11 spezifisch. –
Nichts geändert: Es gibt keine Reflexion in Standard C++. Wenn Sie Informationen zum Laufzeittyp einschalten möchten, können Sie 'dynamic_cast' verwenden. – quantdev
Vielleicht von Interesse: http://Stackoverflow.com/q/25495733/596781 –