C ++ RTTI和派生类

时间:2009-12-15 00:59:04

标签: c++ inheritance 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 个答案:

答案 0 :(得分:8)

啊但是typeid(a).name()Cmd*,因为它定义为Cmd*typeid(*a).name()应该返回CmdA

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

此外,传递给typeid的基类必须具有虚函数,否则返回基类。

MSDN对此有一个更有说服力的解释:

  

如果表达式指向基础   类类型,但实际上是对象   从该基础派生的类型   class,一个type_info引用   派生类是结果。该   表达式必须指向多态   type(具有虚函数的类)。   否则,结果是type_info   对于在中提到的静态类   表达方式。此外,指针   必须被解除引用以便   它指向的对象被使用。没有   取消引用指针,结果   将是指针的type_info,   不是它指向的。

答案 1 :(得分:1)

看起来你是在双人/多人派遣之后......看看here for some info for hacking it into C++。另请查看访客模式。

我认为你基本上想要做的是动态转换以找出类型,然后静态转换来调用适当的handle命令。这就是说我的C ++也生锈了: - )