2009-12-15 3 views
1

Мой C++ немного ржавый. Вот что я пытаюсь сделать:C++ RTTI и производные классы

class Cmd { }; 
class CmdA : public Cmd { }; 
class CmdB : public Cmd { }; 
... 
Cmd *a = new CmdA(); 
Cmd *b = new CmdB(); 

Первая проблема:

cout << typeid (a).name() 
cout << typeid (b).name() 

как возвращение Cmd * типы. Мой желаемый результат - CmdA * и CmdB *. Любой способ выполнения этого, кроме:

if (dynamic_cast <CmdA *> (a)) ... 

Во-вторых, я хотел бы сделать что-то вроде этого:

class Target { 
    public: 
     void handleCommand (Cmd *c) { cout << "generic command..." } 
     void handleCommand (CmdA *a) { cout << "Cmd A"; } 
     void handleCommand (CmdB *b) { cout << "Cmd B"; } 
}; 

Target t; 
t.handleCommand (a); 
t.handleCommand (b); 

и получить выход "Cmd A" и "B Cmd". Сейчас он печатает «generic command ...» дважды.

Благодаря

ответ

7

Ah, но typeid(a).name() будет Cmd*, потому что его определяют как Cmd*. typeid(*a).name() должен возвращать CmdA

http://en.wikipedia.org/wiki/Typeid

Кроме того, базовый класс все, что вы передаете TypeID должны иметь виртуальные функции, в противном случае вы получите обратно базовый класс.

MSDN имеет более красноречивое объяснение, что:

Если выражение указывает на тип базового класса , пока объект на самом деле типа, полученного из этого базового класса, ссылка type_info для Результатом является производный класс . Выражение должно указывать на полиморфный тип (класс с виртуальными функциями). В противном случае результатом будет тип_info для статического класса, указанного в . Кроме того, указатель должен быть разыменован так, чтобы использовался объект , на который он указывает. Без разыменование указателя, результат будет type_info для указателя, не на что он указывает.

+1

Ahh да. Еще одна вещь, которую мне не хватало, заключалась в том, чтобы иметь хотя бы одну виртуальную функцию в Cmd. virtual ~ Cmd() {} – Shaun

1

Похоже, что вы после двойной/мульти отправки ... посмотрите на here for some info for hacking it into C++. Также взгляните на шаблон посетителя.

Я думаю, что вы, по сути, хотите сделать, - это динамический бросок, чтобы выяснить тип, а затем статический приведение, чтобы вызвать соответствующую команду дескриптора. Это говорит о том, что мой C++ тоже ржавый :-)

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