dynamic_cast должен сделать свое дело
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
dynamic_cast
Ключевое слово бросает геодезическое от одного указателя или ссылочного типа к другому, выполняя проверку выполнения для обеспечения достоверности гипсе.
Если вы попытаетесь привести к указателю на тип, который не является типом фактического объекта, результатом приведения будет NULL. Если вы попытаетесь привести к ссылке на тип, который не является типом фактического объекта, приведение вызовет bad_cast
исключение.
Убедитесь, что в Базовом классе есть хотя бы одна виртуальная функция для работы dynamic_cast.
Википедия тема Информация о типе времени выполнения
RTTI доступен только для полиморфных классов, что означает, что у них есть хотя бы один виртуальный метод. На практике это не является ограничением, поскольку базовые классы должны иметь виртуальный деструктор, чтобы объекты производных классов могли выполнять надлежащую очистку, если они удалены из базового указателя.
dynamic_cast
бросает, если это не конвертируемый? Есть ли способ сделать это без генерации броска?A* aptr = dynamic_cast<A*>(ptr);
// разве не должно быть такuint8_t*
? То есть я могу это проверитьuint32_t* x = dynamic_cast<uint32_t*>(p)
, гдеp
находитсяuint8_t*
? (Я пытаюсь найти тест на наказание нарушений).Динамическое приведение является лучшим для вашего описания проблемы, но я просто хочу добавить, что вы можете найти тип класса с помощью:
источник
11MyClass
. Чтобы разобраться, вы можете использовать библиотеку расширений ABI вcxxabi.h
. Это дает вам,abi::__cxa_demangle
который даст вам настоящее имяЭто называется RTTI , но вы почти наверняка захотите пересмотреть свой дизайн здесь, потому что поиск типа и выполнение специальных действий на его основе делает ваш код более хрупким.
источник
Просто чтобы закончить, я соберу сборку из Robocide и укажу, что
typeid
ее можно использовать отдельно, без использования name ():Вывод:
источник
Вероятно, встраивайте в ваши объекты идентификатор «тег» и используйте его, чтобы различать объекты класса А и объекты класса В.
Это однако показывает недостаток в дизайне. В идеале те методы в B, которых у A нет, должны быть частью A, но оставлены пустыми, и B перезаписывает их. Это устраняет специфический для класса код и больше соответствует духу ООП.
источник
Ты ищешь
dynamic_cast<B*>(pointer)
источник
Потому что ваш класс не полиморфный. Пытаться:
Сейчас
BaseClas
полиморфный. Я изменил класс на struct, потому что члены структуры по умолчанию являются публичными.источник
Ваше описание немного сбивает с толку.
Вообще говоря, хотя некоторые реализации C ++ имеют механизмы для этого, вы не должны спрашивать о типе. Вместо этого вы должны сделать dynamic_cast для указателя на A. Что это будет делать, так это то, что во время выполнения будет проверяться фактическое содержимое указателя на A. Если у вас есть B, вы получите указатель на B. В противном случае вы получите исключение или ноль.
источник
Как указали другие, вы можете использовать dynamic_cast. Но в целом использование dynamic_cast для определения типа производного класса, с которым вы работаете, указывает на плохой дизайн. Если вы переопределяете функцию, которая принимает указатель A в качестве параметра, тогда она должна иметь возможность работать с методами / данными самого класса A и не должна зависеть от данных класса B. В вашем случае вместо переопределения, если вы уверены, что метод, который вы пишете, будет работать только с классом B, тогда вам следует написать новый метод в классе B.
источник
Используйте перегруженные функции. Не требует dynamic_cast или даже RTTI поддержки:
источник
Если вы можете получить доступ к библиотеке надстроек , возможно, вам нужна функция type_id_with_cvr () , которая может предоставить тип данных без удаления модификаторов const, volatile, & и & && . Вот простой пример в C ++ 11:
Надеюсь, это полезно.
источник