2016-05-07 5 views
0

Предположим, у нас есть символ BaseClass и три подкласса Good, Bad, Zombie. предположить Также у нас есть два указателяУказатели, указывающие в унаследованных классах

Character* ptr1,ptr2;

, что точка в классе хороший, плохой или зомби. Я хочу, чтобы создать часть кода, как это:

if ((ptr1 "shows" Good)&&(ptr2 "shows" Bad)) {...} else if ((ptr1 "shows" Good)&&(ptr2 "shows" Zombie)) {...} else if ...

и так далее. Как я могу написать такое заявление? Мне трудно понять виртуальные функции, полиморфизм и наследование, но не стесняйтесь объяснять их.

спасибо, заранее.

+2

Вы можете использовать 'dynamic_cast', чтобы проверить, является ли' ptr # 'конвертируемой в любой из производных классов. – 101010

+2

('ptr2' не объявлен как указатель) – LogicStuff

ответ

0

Вы можете использовать dynamic_cast следующим образом:

if (dynamic_cast<Good*>(ptr1) && dynamic_cast<Bad*>(ptr2)) { 
    ... 
} else if (dynamic_cast<Good*>(ptr1) && dynamic_cast<Zombie*>(ptr2)) { 
    ... 
} else if ... 
+0

dynamic_cast также выбрасывает std :: bad_cast – user31264

2

Вы можете объявить виртуальный публичный метод в символ, который возвращает класс перечисления, представляющий тип символа, например

virtual CharacterType GetCharacterType(); 
.... 
if((ptr1->GetCharacterType() == CharacterType::Good) && ptr2->GetCharacterType() == CharacterType::Bad)) {...} 

или виртуальный метод, который подтверждает тип символа.

virtual bool Is(CharacterType characterType); 
.... 
if((ptr1->Is(CharacterType::Good) && ptr2->Is(CharacterType::Bad)) {...} 
Смежные вопросы