С++ 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
Ответы
Ответ 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.