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++ тоже ржавый:-)

Другие вопросы по тегам