Есть два способа, которыми вы можете это сделать. Во-первых, вы можете использовать оператор typeid
, который возвращает структуру type_info
, содержащую информацию о типе объекта. Например:
Base* ptr = /* ... */
if (typeid(*ptr) == typeid(DerivedType)) {
/* ... ptr points to a DerivedType ... */
}
Обратите внимание, что вы должны использовать typeid(*ptr)
и не typeid(ptr)
здесь. Если вы используете typeid(ptr)
, вы вернете объект type_info
для Base*
, так как указатель имеет тип Base*
, независимо от того, на что он указывает.
Важно отметить, что это будет проверять, что ptr
точек на это точно в DerivedType
. Если ptr
указывает на объект типа, производный от DerivedType
(возможно, EvenMoreDerivedType
), этот код будет работать неправильно.
Альтернативный способ проверки того, указываете ли вы на объект некоторого типа, который является более надежным, заключается в использовании оператора dynamic_cast
. dynamic_cast
выполняет проверенный тип при выполнении во время выполнения, который даст допустимый указатель, если листинг преуспеет, а NULL - в противном случае. Например:
Base* ptr = /* ... */;
DerivedType* derived = dynamic_cast<DerivedType*>(ptr);
if (derived) {
/* ... points to a DerivedType ... */
}
Это имеет дополнительное преимущество, что если ptr
указывает на что-то вроде EvenMoreDerivedType
, актеры все равно добиться успеха, потому что EvenMoreDerivedType
наследует от DerivedType
.
В качестве последней мысли, вы иногда видите код, как это:
Base* ptr = /* ... */
if (DerivedType* derived = dynamic_cast<DerivedType*>(ptr)) {
/* ... points to a DerivedType ... */
}
Это локально-привязывает derived
указатель на тело if
заявления и использует тот факт, что отличные от нуля значения оценки для true
в C++. Я лично считаю, что это легче читать и менее подвержено ошибкам, но, во что бы то ни стало, подходит для вас, что проще для вас.
Надеюсь, это поможет!
Каков тип 'childObject'? В C++ нет общего способа сделать это, потому что во время выполнения понятие типа не существует. –
Хорошо, я отредактирую вопрос – Homam
Хотя вы ничего не сказали о том, что такое childObject.GetType(), тем не менее этот код ужасен, потому что он разворачивается по типу сравнения. Это то, что ООП должно устранить. –