2015-06-29 4 views
1

упрощенного пример моей проблемы:Проверьте тип происходит от данного родительского типа

У меня есть абстрактный класс A. У меня есть два абстрактных класса B и C наследующий от A. И у меня есть много выпускных классов наследуя от B или C:

class A; 
class B : public A; 
class C : public A; 
class B1 : public B; 
class B2 : public B; 
class C1 : public C; 
class C2 : public C; 

Я реализовать алгоритм ПОЛУЧАТЬ указатель на A того, чтобы знать, если тип приходит из B или C работать правильно:

void algorithm(boost::shared_ptr<const A> a) 
{ 
    if(*a is a B instance) 
    // do something 
    else if(*a is a C instance) 
    // do something other 
} 

Как я могу проверить это просто без C++ 11?

Я знаю, как проверить окончательный вид с typeid(*a) == typeid(C1), но я не знаю, как проверить родительский тип ...

+0

возможно см. [Здесь] (http://stackoverflow.com/questions/2910979/how-does-is-base-of-work) –

ответ

2

Вы можете использовать dynamic_pointer_cast:

if (std::dynamic_pointer_cast<B>(a)) { 
    ... 
} 
else if (std::dynamic_pointer_cast<C>(a) { 
    ... 
} 
+0

Hum ... Это C++ 11, но он также определен в увеличение. Кажется, это так просто! Это также хороший способ проверить конечный тип? Или лучше проверить с 'typeid'? – Caduchon

+0

Если вы хотите знать точный тип, используйте typeid. Но для соблюдения принципа замещения Лискова лучше использовать динамический бросок. Поскольку экземпляры B1 и B2 должны работать так же, как B, поэтому не имеет значения, является ли это экземпляром B или если он является одним из подклассов. –

2

Использование dynamic_cast.

if (dynamic_cast<B *>(a)) 
{ 
     // // a actually points at a B, or something derived unambiguously from B 
} 

Конечно, в общем, вам нужно вернуться к дизайну своей функции. Чаще всего было бы лучше не знать о классах, полученных из A. Избегание этого обычно означает использование A в качестве полиморфной базы, которая обеспечивает интерфейс ко всей функциональности, необходимой в функции (например, набор функций virtual, которые классы, такие как B и C, могут специализироваться для себя).

+0

Вы правы. Но на самом деле это для процесса дампа/загрузки, который должен знать реальный тип объекта, чтобы иметь возможность перераспределять его с точным типом. – Caduchon

Смежные вопросы