С++ dynamic_cast vs typeid для сравнения классов - программирование
Подтвердить что ты не робот

С++ dynamic_cast vs typeid для сравнения классов

Возможный дубликат:
С++ эквивалент instanceof

Мне было интересно, какая разница между dynamic_cast и typeid относится только к сопоставлению классов (кроме dynamic_cast), позволяющих получить доступ к подклассу методы и typeid только полезны для сравнения классов). Я нашел двухлетний StackOverflow, задающий тот же вопрос: эквивалент С++ экземпляра. Тем не менее, мне уже два года, и я не хотел, чтобы в некрополе был старый пост (и я не уверен, когда вышел typeid), поэтому я подумал, что задаю тот же вопрос с небольшой разницей.

В принципе, у меня есть класс A и класс B, которые являются подклассами абстрактного класса C. Класс C берется как параметр для метода, и я хочу определить, действительно ли класс C является классом A или классом B. И typeid, и dynamic_cast работают правильно, поэтому это скорее вопрос лучшей практики/производительности. Я предполагаю:

A* test = dynamic_cast<A*> someClassCVar
if (test != 0) { //it is of class A }

ИЛИ

if (typeid(someClassCVar) == typeid(A)) {
   //it is of class A
}

EDIT: Извините, я забыл включить этот бит информации. Документация ActiveMQ CMS предусматривает использование dynamic_cast, но я думаю, что это только потому, что предполагает, что пользователь захочет получить доступ к методам, специфичным для подкласса. Для меня кажется, что typeid будет лучшей производительностью, если требуется только сравнение классов: http://activemq.apache.org/cms/cms-api-overview.html

4b9b3361

Ответ 1

Существует важная разница между двумя способами:

if(A* test = dynamic_cast<A*>(&someClassCVar)) {
    // someClassCVar is A or publicly derived from A
}

В то время как:

if(typeid(someClassCVar) == typeid(A)) {
   // someClassCVar is of class A, not a derived class
}

Ответ 2

Это зависит от того, нужна ли обработка идентификации типа сообщения указателю на A или нет.

cheking typeid, несомненно, будет быстрее (поскольку они являются компиляторами, генерирующими постоянные идентификаторы), но не будет предоставлять какой-либо экземпляр A для управления, поэтому обязуется выполнить динамическое_сканирование, чтобы получить экземпляр A.