Sha*_*aun 2 c++ inheritance rtti
我的C++有点生疏.这是我正在尝试做的事情:
class Cmd { };
class CmdA : public Cmd { };
class CmdB : public Cmd { };
...
Cmd *a = new CmdA ();
Cmd *b = new CmdB ();
Run Code Online (Sandbox Code Playgroud)
第一个问题:
cout << typeid (a).name ()
cout << typeid (b).name ()
Run Code Online (Sandbox Code Playgroud)
两者都返回Cmd*类型.我想要的结果是CmdA*和CmdB*.除此之外的任何方式实现此目的:
if (dynamic_cast <CmdA *> (a)) ...
Run Code Online (Sandbox Code Playgroud)
其次,我想做这样的事情:
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);
Run Code Online (Sandbox Code Playgroud)
并获得输出"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,而不是指向的指针.