簡體   English   中英

無法覆蓋派生類中的靜態初始化

[英]cannot override static initialization in derived class

我正在嘗試為層次結構中的類提供不同的靜態初始化,但是當我嘗試使用此代碼時:

#include <iostream>

using namespace std;

struct base {
static const char* componentName;
};
const char* base::componentName = "base";

struct derived : public base {};

const char* derived::componentName = "derived";

int main() {

cout << base::componentName << endl;
cout << derived::componentName << endl;
}

我最終得到了這個構建錯誤:

test.cpp:15: error: ISO C++ does not permit ‘base::componentName’ to be defined as ‘derived::componentName’
test.cpp:15: error: redefinition of ‘const char* base::componentName’
test.cpp:11: error: ‘const char* base::componentName’ previously defined here

似乎靜態初始化不能在派生類上重寫? 如果這不起作用,我可能總是將componentName定義為一個返回const char *的靜態函數,唯一的問題是我希望對部分特化進行初始化,並且似乎沒有任何方法我知道在部分特化中只重新定義一個函數,而不復制將保持大部分相同的所有其他代碼

您還需要在子類中聲明它。

struct derived : public base {
    static const char* componentName;
};


我認為原因是因為以下情況屬實:

&base::componentName == &derived::componentName

它們引用同一個對象,並在a中初始化一個對象兩次
“誰笑到最后,笑得最好”的態度不可能是件好事。

干杯。

Vintz

靜態成員變量意味着在該類的所有實例之間共享一個變量。 嘗試為基類創建一個值並為派生類設置不同的值不起作用,因為它們共享同一個變量,這顯然不能同時設置為兩個不同的值。

如果在派生類中聲明之前嘗試初始化派生類中的靜態變量,則會得到重定義錯誤,因為派生類類似於基類,靜態變量僅為類定義一次,因此第二次初始化會導致重定義錯誤。

做你想要的正確方法之一是下面的;

struct a {
    virtual const string& getClassType() const {
        return ClassName;
    }
    static string ClassName;
};
string a::ClassName = "StructA";

struct c : public a {
    const string& getClassType() const {
        return ClassName;
    }
    static string ClassName;
};
string c::ClassName = "StructC";

a* a1 = new c();
cout << a1->getClassType() << endl;

注意在上面的代碼中,getClassType是虛函數,並以字符串格式返回類類型。 此函數使用靜態變量,也必須在派生類中重寫。 如果您忘記覆蓋它,編譯器將調用該函數的基類版本,它將使用基類靜態變量而不是派生類靜態變量。 因此,它將返回基類的對象類型。

'覆蓋'和'繼承'是僅對對象有意義的術語。 類變量不參與對象繼承。

$ 9.4.2 / 2 - “在命名空間范圍的定義中,靜態數據成員的名稱應使用::運算符通過類名限定。”

和...

似乎靜態初始化不能在派生類上重寫?

請記住,覆蓋僅適用於虛擬功能。

$ 10.3 / 2 - '如果虛擬成員函數vf在類Base和Derived中直接或間接派生的類中聲明,則聲明具有與Base :: vf相同名稱和相同參數列表的成員函數vf,然后Derived :: vf也是虛擬的(無論是否如此聲明)並覆蓋97)Base :: vf。

您可以嘗試重新啟動組件名稱,同時獲得使用多態代碼的優勢。

struct base{
   virtual char const* myname(){
      return "base";
   }
   virtual ~base(){}
};

struct derived : base{
   virtual char const* myname(){
      return "derived";
   }
};

int main(){}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM