2

我的 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”。现在它打印出“通用命令...”两次。

谢谢

4

2 回答 2

8

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

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

此外,您传递给 typeid 的任何内容的基类都必须具有虚函数,否则您将返回基类。

MSDN对此有更雄辩的解释:

如果表达式指向基类类型,但对象实际上是从该基类派生的类型,则结果是派生类的 type_info 引用。表达式必须指向多态类型(具有虚函数的类)。否则,结果是表达式中引用的静态类的 type_info。此外,必须取消引用指针,以便使用它指向的对象。如果不取消引用指针,结果将是指针的 type_info,而不是它指向的内容。

于 2009-12-15T01:06:54.517 回答
1

看起来你是在双重/多重调度之后......看看这里的一些信息,以将其破解为 C++。还要看一下访客模式。

我认为您本质上想要做的是动态转换来确定类型,然后是静态转换来调用适当的句柄命令。话虽如此,我的 C++ 也生锈了 :-)

于 2009-12-15T01:06:03.537 回答