繁体   English   中英

C ++ RTTI和派生类

[英]C++ RTTI and Derived Classes

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

谢谢

啊但是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 ++也生锈了:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM