繁体   English   中英

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

[英]Programmatically getting the name of a derived class

我正在尝试做类似的事情:

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

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

Derived d;
MoreDerived m;

问题是,当我需要查看DerivedMoreDerived时,我总是将Base打印到屏幕上。 有没有办法让 typeid 以这种方式与派生类一起工作? 或者除了typeid还有其他方法吗?

注意:我正在向已编码的套件添加功能,因此我不想在派生类自己返回此值的基础 class 中添加虚拟方法。 此外,不用担心运行时开销,这将是调试编译开关的一部分。

在构造函数 Base() 中,object 仍然是一个“Base”实例。 它将在 Base() 构造函数之后成为 Derived 实例。 尝试在施工进行,它会起作用。

参见例如:

您不能在构造函数(或析构函数)中执行此操作——无论是使用typeid还是使用虚拟方法。 原因是当您在构造函数中时,vtable 指针设置为正在构造的基础 class,因此 object 是基础 class 并且在该点上没有任何多态性。

您必须在构造最派生的 class 之后执行该代码。 一种选择是使用工厂 function:

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

另一种选择是提供一个虚拟 toName() function

struct Object{
  virtual std::string toName() const = 0;
}
struct Base: Object{
  std::string toName()const{ return "Base"; }
}
struct Derived: Base, Object{
  std::string toName()const{ return "Derived"; }

这可能会变得乏味,因为您需要手动创建每个 toName function。 但它给您的好处是提供您自己的自定义名称。

暂无
暂无

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

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