基類
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 中每個類都乙個建構函式和乙個析構函式,即使使用者不明確定義,系統也會類定義乙個預設的建構函式和析構函式。當建立該類的物件可以顯示或者隱式...