[英]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.