В C++ простые старые данные (POD) не имеют информации о времени исполнения. Все описанные классы принимают ровно 1 байт и имеют идентичные представления во время выполнения в любом компиляторе с пустым оптимизацией базового класса.
Как таковое вы не можете сделать.
Добавление виртуального деструктора в базовый класс добавляется в RTTI и dynamic_cast
.
Добавление поля enum
или int
к базе, которая инициализируется по-разному для каждого производного класса.
Еще один вариант заключается в создании функции шаблона и хранить указатель на него, например, так:
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>;}
, а затем хранящий my_type_id
в A
инициализируется соответствующим образом. Это заново изобретает RTTI, и, поскольку вам нужно больше возможностей, вы подойдете к накладным расходам C++ RTTI.
В C++ вы платите только за то, что просите: вы можете запросить классы без RTTI, которые вы сделали, и получить его.
RTTI - информация о времени выполнения. POD - это простые старые данные, термин C++ 03. Многие классы не являются POD: простой способ заключается в добавлении деструктора virtual
. C++ 11 имеет более мелкозернистую стандартную компоновку и агрегированные термины.
Технически RTTI и POD не являются противоположностями друг от друга: существуют классы без RTTI, которые не являются POD.
Обратите внимание, что в MSVC есть опции, чтобы не генерировать RTTI, и его агрессивный складной склад Comdat может нарушить ручной RTTI, который я сделал выше, в обоих случаях в нарушение стандарта.
Вы запрашиваете 'dynamic_cast <>'? Это не C++ 11. –
Ничего не изменилось: в стандарте C++ нет отражения. Если вы хотите включить информацию о типе времени выполнения, вы 'dynamic_cast' – quantdev
Может быть интересно: http://stackoverflow.com/q/25495733/596781 –