模板類中的靜態變數,用於繼承時子類的靜態變數的獨佔

2021-06-20 05:04:35 字數 1242 閱讀 5507

用於繼承時,模板函式基類,子類可以擁有屬於子類本身自己的靜態變數,而不是所有的子類共用父類的靜態變數。如果使用非模板函式基類,所有的子類共用父類的的靜態變數。

meyers在條款7中給出了乙個用於實現 "class   專屬的new-handlers ",用class   x實現了乙個 

用template和inheritance實現了乙個,在template版本中,meyers解釋說: 

之所以使用inheritance是為了使derived   class   也具有這種能力(class   專屬的new-handlers)。 

而之所以使用template,是因為確保每乙份derived   class擁有乙個不同的currenthandler   data   

member,(侯捷解釋:因為它(變數   currenthandler)是乙個static   data   member,所以才需要 

這項特別技術),請教侯捷為什麼做出這樣的解釋? 

*************************=

基類的靜態成員是唯一的,如果不用模板,所有從newhandlersupport繼承的類的currenthandler都一樣,你在乙個派生類裡set_new_handler之後,其他派生類的currenthandler就不能用了。 

而以派生類型別為引數的模板基類,每個派生類的基類其實都不一樣,其靜態成員就是每個派生類自已有乙個了。 

比如說 

class   b; 

int   b::a; 

class   d1   :   public   b{}; 

class   d2   :   public   b{}; 

... 

d1   x;   d2   y; 

x.a   =   1; 

assert(y.a   ==   1); 

如上,d1和d2的a是相同的。而 

template class   b; 

template int   b ::a; 

class   d1   :   public   b {}; 

class   d2   :   public   b {}; 

... 

d1   x;   d2   y; 

x.a   =   1; 

y.a   =   2; 

assert(x.a   ==   1); 

assert(y.a   ==   2); 

d1和d2有不同的a。 

類模板中的靜態變數

先上 具體看輸出和注釋 編譯器並不是把函式模板處理成能夠處理任意類的函式 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 在宣告的地方對模板 本身進行編譯 在呼叫的地方對引數替換後的 進行編譯。include using namespace std template cl...

關於靜態變數的繼承

父類 package test public class father 子類1 package test public class son1 extends father 子類2 package test public class son2 extends father 測試 package tes...

C 類中的靜態變數

c 類中的靜態變數 靜態資料成員 下面看乙個例子 include class point static void init void main void 這樣編譯是不會有任何錯誤的。下面這樣看 include class point static void init void main void 這...