不同子類擁有基類的不同的靜態成員變數的方法
大家都知道所有子類物件(不管是相同的子類或是不同的子類)擁有基類的相同靜態成員變數。因為靜態變數是屬於類的,而不是屬於某個物件的。所以如下程式碼:
#include <iostream>
using namespace std;
class Base
{
public:
static int data;
};
int Base<T>::data = 0;
class Derivd:public Base
{
};
class Derivd2:public Base
{
};
int main()
{
Derivd d;
d.data = 12;
Derivd2 d2;
cout<<d2.data<<endl;
}
這裡d2的data物件和d的data物件其實是同一份,d修改了data的值導致d2中的data值也被修改了。可以藉助模板的不同具類化解決這個問題,實現程式碼如下:
#include <iostream>
using namespace std;
template<typename T>
class Base
{
public:
static int data;
};
template<typename T>
int Base<T>::data = 0;
class Derivd:public Base<Derivd>
{
};
class Derivd2:public Base<Derivd2>
{
};
int main()
{
Derivd d;
d.data = 12;
Derivd2 d2;
cout<<d2.data<<endl;
Derivd d3;
}
這裡基類模板的不同具類化會生成不同的靜態物件,從而使得d和d2各自有各自的靜態資料data。但是任然沒有解決d和d3共用同一份data資料。