#c #hierarchy #base #derived
Вопрос:
Я не могу использовать dynamic_cast, потому что я не знаю имен производных классов. Аналогично для std::is_base_of.
Комментарии:
1. Является ли базовый класс чисто виртуальным? Тогда ответ «да», чего бы это ни стоило.
2. Обычно, если вас волнует, является ли объект на самом деле производным типом или базовым типом, вы, вероятно, допустили ошибку в том, как вы использовали наследование.
3. вопрос остается неясным. Вам не нужно знать имя типа, чтобы запрашивать свойства этого типа. Как только у вас появится объект:
using type_of_the_object = decltype(object);
4. typeid должен дать вам полиморфный тип, который вы можете сравнить с известным типом базового класса.
Ответ №1:
Ваш вопрос в основном заключается в том, как проверить, является ли динамический тип объекта, который у вас есть (по указателю или ссылке Base
), на самом деле Base
. Это работа для typeid
:
struct Base { /* ... */ };
bool is_actually_base(Baseamp; b) { return typeid(b) == typeid(Base); }
Если этот тест возвращает false, объект должен быть производного типа класса (или вы где-то напутали, и ваша программа ведет себя неопределенно).
Обратите внимание, что это работает только в том случае, если Base
содержит хотя бы одну виртуальную функцию (возможно, унаследованную). Если это не так, то нет никакого способа проверить.