C ++ RTTI и производные классы - PullRequest
       15

C ++ RTTI и производные классы

2 голосов
/ 15 декабря 2009

Мой 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 ]

8 голосов
/ 15 декабря 2009

Ах, но typeid(a).name() будет Cmd*, потому что он определен как Cmd*. typeid(*a).name() должен вернуть CmdA

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

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

В MSDN есть более красноречивое объяснение этого:

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

1 голос
/ 15 декабря 2009

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

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

...