Определение типа объекта при полиморфизме - PullRequest
1 голос
/ 27 июня 2011

Допустим, у меня есть class A, который увеличен на B и C. Теперь, из-за отсутствия полиморфизма, я использую указатель базового класса, чтобы указать на объект производного класса.

A *a = new B(); OR A *a= new C();

Теперь, допустим, я выполнил несколько заявлений. Теперь я заинтересован в определении типа объекта, на который указывает указатель базового класса. Как это можно сделать?

Ответы [ 2 ]

8 голосов
/ 27 июня 2011

Прямой способ будет использовать dynamic_cast:

B* b = dynamic_cast<B*>( a );
if( b != 0 ) {
  // the object can be cast to class B safely
}

однако реальный ответ вам не нужен, когда вы правильно делаете полиморфизм - вы должны использовать виртуальные функции и соответствующим образом реализовывать их в производных классах, чтобы вы могли слепо вызывать их и выполнять правильный код.

2 голосов
/ 27 июня 2011

Зависит.

Вы можете использовать typeid для быстрой и грязной идентификации типа.

Или вы можете использовать dynamic_cast, чтобы проверить, есть ли у вас объект данного типа (Удивительно, но это может быть быстрее, чем typeid).

Если вас интересует наиболее производный объект, например, с целью хеширования, то если статически известный класс является полиморфным, вы можете использовать dynamic_cast<void*>.Это просто косвенная идентификация типа.Он дает пустой указатель на объект самого производного типа, который вы можете рассматривать как уникальный «адрес» объекта.

Но, как правило, не стоит пытаться идентифицировать точный тип, за исключением сериализации.- и сериализация намного больше, чем это!

Приветствия & hth.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...