以编程方式获取派生类的名称

ste*_*225 16 c++ typeid

我试图做类似的事情:

class Base {
public:
   Base() {
      cout << typeid(*this).name() << endl;
   }
   ...
};

class Derived : public Base { ... }
class MoreDerived : public Derived { ... }

Derived d;
MoreDerived m;
Run Code Online (Sandbox Code Playgroud)

问题是,Base当我需要看到Derived和时,我总是被打印到屏幕上MoreDerived.有没有办法让typeid以派生类的方式工作?或者还有另一种方法typeid吗?

注意:我正在为已经编码的套件添加功能,所以我不想在基类中添加虚方法,派生类本身会返回此值.此外,不担心运行时开销,这将是调试编译开关的一部分.

ysd*_*sdx 14

在构造函数Base()中,该对象仍然是"Base"实例.它将成为Base()构造函数之后的Derived实例.尝试在施工进行,它会起作用.

参见例如:

避免在构造函数中使用虚方法

http://www.artima.com/cppsource/nevercall.html


sha*_*oth 10

您无法在构造函数(或析构函数)中执行此操作 - 既不使用typeid也不使用虚方法.原因是当你在构造函数中时,vtable指针被设置为正在构造的基类,因此该对象属于基类,并且在该点上没有多少多态将有所帮助.

在构造了最派生的类之后,您必须执行该代码.一种选择是使用工厂功能:

template<class T>
T* CreateInstance()
{
    T* object = new T();
    cout << typeid(*object).name() << endl;
    return object;
}
Run Code Online (Sandbox Code Playgroud)