C++ RTTI и производные классы
Мой C++ немного ржавый. Вот что я пытаюсь сделать:
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" и "Cmd B". Прямо сейчас он печатает "универсальную команду..." дважды.
Спасибо
2 ответа
Ах но typeid(a).name()
будет Cmd*
потому что это определяется как Cmd*
, typeid(*a).name()
должен вернуться CmdA
http://en.wikipedia.org/wiki/Typeid
Кроме того, базовый класс того, что вы передаете typeid, должен иметь виртуальные функции, в противном случае вы получите базовый класс.
У MSDN есть более красноречивое объяснение этому:
Если выражение указывает на тип базового класса, но объект фактически является типом, производным от этого базового класса, результатом является ссылка на type_info для производного класса. Выражение должно указывать на полиморфный тип (класс с виртуальными функциями). В противном случае результатом является type_info для статического класса, указанного в выражении. Кроме того, указатель должен быть разыменован для использования объекта, на который он указывает. Без разыменования указателя результатом будет указатель type_info для указателя, а не то, на что он указывает.
Похоже, что вы после двойной / многократной отправки... посмотрите здесь некоторую информацию для взлома ее в C++. Также взгляните на шаблон посетителя.
Я думаю, что вы, по сути, захотите сделать это динамическое приведение для определения типа, а затем статическое приведение для вызова соответствующей команды handle. При этом мой C++ тоже ржавый:-)