簡體   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