類的繼承中的乙個錯誤

2021-06-21 14:56:16 字數 1177 閱讀 1457

基類

templateclass mstack

;

派生類1

template class s1:public mstack;
派生類2

templateclass s2:public mstack;
兩個派生類都實現了基類的虛函式,結果出現編譯錯誤

error c2995: 'bool mstack::mpush(t)' : function template has already been defined

error c2995: 'bool mstack::mpop(t &)' : function template has already been defined

error c2995: 'bool mstack::misempty(void)' : function template has already been defined

嘗試1:

在兩個派生類中重新宣告一下虛基類的函式

嘗試2:

去掉乙個派生類

這兩種都不會再出現編譯錯誤

總結一下繼承時出現的一些錯誤:

1.基類中函式不是虛函式時:在基類中不必有函式實現,編譯器不會報錯

(1)如果有兩個或兩個以上的派生類,覆蓋(不能叫覆蓋應該叫隱藏)時,至少要在其中乙個派生類中重新宣告函式,否則報錯:

error c2995: 'bool mstack::mpush(t)' : function template has already been defined
(2)如果只有乙個派生類,在派生類中實現時必須宣告,否則編譯報錯

error c2509: 'mpush' : member function not declared in 's1'

2.基類中函式為虛函式時:

①若不是純虛函式,在基類中必須有實現,否則報錯:

無法解析的外部符號
②若是純虛函式,在基類中不必有實現版本

③純虛函式覆蓋時必須在派生類中重新宣告

總之如果派生類想覆蓋或隱藏基類函式,派生類中都需有宣告





乙個繼承錯誤

今天在寫乙個類的繼承,在除錯的時候,虛函式的特點並沒有體現出來,讓我很是不解,用了兩個編譯器,結果都是一樣的。類的 是這樣的 1 ifndef classbrass h included 2 define classbrass h included 3 include 4 include 5 6us...

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

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

設計乙個不能被繼承的類

分類 cpp 2012 02 19 20 33 1390人閱讀收藏 舉報destructor constructor function class 編譯器c 在c 中每個類都乙個建構函式和乙個析構函式,即使使用者不明確定義,系統也會類定義乙個預設的建構函式和析構函式。當建立該類的物件可以顯示或者隱式...