繼承乙個模板類要用this指標訪問基類

2021-10-23 11:06:28 字數 761 閱讀 2118

在c++中如果父類是模板類,在子類中直接呼叫 父類帶模板定義的成員 的話,會報錯找不到該變數,其根本原因是因為模板的二次編譯機制導致的。

父類宣告:

template class seqlist:public list;
子類宣告:

templateclass staticlist: public seqlist

int capacity()const

};

問題主要在於模板要編譯兩次。

模板定義階段(第一階段)

只對模板中和模板引數無關的名字進行查詢(無視那些有模板引數的部分)。由於父類是模板類,所以在第一次編譯的時候那些和泛型扯上關係的變數會被無視掉。

staticlist 繼承自 seqlist,在第一次編譯的時候編譯器會忽略掉 seqlist,假裝沒有看到它,因此seqlist中的成員 m_array 和 m_length 就順理成章地被忽略了。

staticlist 中沒有再次定義 m_array 和 m_length,因此編譯器在第一次編譯的時候無法找到m_array和length直接報錯了。

模板例項化階段(第二階段)

在第二階段編譯器主要處理帶模板引數的部分,所有和模板相關的操作都在該階段完成。

在每個成員變數之前加入了 base:: 或者 this 指標,通過 base:: 或者 this 指標,將成員變數拖到第二階段進行編譯。這樣才能被編譯。

有關繼承類乙個細節 (補充繼承類)

我在微博中已經提到繼承的方式有三種 公有繼承 私有繼承 保護繼承 然私有繼承會將基類的公有成員變成私有成員。如果,我們想通過外部訪問基類中的成員,則無法實現,原因在於私有繼承將基類中的公有成員變成了私有成員。為此,我們將想辦法將子類中私有成員 基類的公有成員 變成子類公有成員,則需用到 此符號,便會...

乙個類只有乙個指標嗎?

c 中類的指標 乙個類只有乙個指標嗎?比如 this 指標。事實上每乙個基類都有乙個指標,這樣乙個多重繼承和多型繼承的類就有多個 this 指標,但如果所有這些類層次都是單一繼承,那麼所有指標都是相同的,指向例項的起始位置。this 指標並不會真實的存貯在某個地方,它是編譯器在編譯時確定的,就象 s...

乙個VB陣列指標類

顧名思義了,這個 就是將指定的記憶體位址繫結到乙個vb陣列,即com中的safearray上。所謂繫結,是指在使用該記憶體位址之前,並不需要申請相應的本地記憶體緩衝區,也不需要進行記憶體複製,只是根據該位址憑空構造乙個vb陣列,並將陣列的真實資料位址指向該位址。當然,該類的功能完全可以用copyme...