條款36:絕不重新定義繼承而來的non-virtual函式
用第乙個將呼叫的是b類的func,第二個呼叫的是d類的func,這是因為對普通的函式我們是採用的靜態鏈結,因此對於p雖然指向class b;
class d:public b;
在上面的簡單例子中,如果有下面的呼叫:
d x;
b* p = new d();
d* q = new d();
p->func();
q->func();
此時上面的兩個呼叫呼叫的都是b類的func函式,此時如果在d類中也重新定義函式void func(),此時如果還是上面那樣的調
的是d類的乙個物件,但是因為在靜態連線階段不能夠知道其具體指向的物件,因此指向的還是b類的func,在前面的條款中我們說
過對於public繼承的體系中,父類的成員函式是完全適用於子類的,但是如果過載了函式的實現,那麼這個條款將不適合,因此在
public繼承體系中,子類可以重新定義父類的virtual的介面函式,而非實現函式!
請記住:
Effective C 讀書筆記3
條款8 別讓異常逃離析構函式 c 並不禁止析構函式吐出異常,但不鼓勵這樣做。但如果你的析構函式必須執行乙個動作,而該動作可能會在失敗時丟擲異常,該怎麼辦?兩個辦法解決 一是 如果丟擲異常程式就結束,通常通過呼叫abort函式完成 dbconn dbconn catch 如果程式遭遇乙個於析構期間發生...
effective C 讀書筆記 3
1 p18 頁 經過我的實驗 void f1 const a a 和void f2 a const a 是不同的!莫非書上有錯?2 stl迭代器 天生就是 t const ptr 如果需要乙個 const t ptr 則需要的是 const iterator 3 這個表要記一下子 3 non con...
《effective C 》讀書筆記
1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...