Effective C 筆記 第六章

2021-09-27 02:02:48 字數 2226 閱讀 2119

public繼承是is-a的關係

derived class作用域被巢狀在base class作用域內

不重新定義繼承而來的預設引數值,virtual函式動態繫結,而預設引數值卻是靜態繫結

避免遮掩繼承而來的名稱,即使base classes和derived classes內的函式有不同的引數型別也適用,而且不論函式是virtual 或 non-virtual 一樣適用

class

base

;class

derived

:public base

;

derived d;

int x;

...d.

mf1();

//沒問題,呼叫derived::mf1

d.mf1

(x);

//錯誤,因為derived::mf1遮掩了base::mf1

d.mf2()

;//沒問題,呼叫base::mf2

d.mf3()

;//沒問題,呼叫derived::mf3

d.mf3

(x);

//錯誤,因為derived::mf3遮掩了base::mf3

如果你繼承base class並加上過載函式,而又希望重新定義或覆寫其中一部分,那麼你必須為那些原本會被遮掩的每個名稱引入乙個using宣告式,否則某些你希望繼承的名稱會被遮掩
class

base

;class

derived

:public base

;

derived d;

int x;

...d.

mf1();

//沒問題,呼叫derived::mf1

d.mf1

(x);

//現在沒問題了,呼叫base::mf1

d.mf2()

;//沒問題,呼叫base::mf2

d.mf3()

;//沒問題,呼叫derived::mf3

d.mf3

(x);

//現在沒問題了,呼叫base::mf3

如果derived唯一想繼承mf1那個無引數版本,可以用private繼承,用乙個簡單的轉交函式
class

derived

:private base

};

絕不重新定義繼承而來的non-virtual函式。non-virtual函式是靜態繫結的,由於pb被宣告為乙個pointer-to-b,通過pb呼叫的non-virtual函式永遠是b所定義的版本,即使pb指向乙個型別為「b派生之class」的物件
d x;

b* pb=

&x; pb-

>mf(

);//呼叫b::mf

pd->mf(

);//呼叫d::mf

classb;

classd:

:publicb;

```當mf被呼叫,任何乙個d物件都可能表現出b或d的行為:決定因素不再物件自身,而在於「指向該物件之指標」當初的宣告型別

或者理解為public繼承是is-a的關係,適用於b的每一件事也適用於d,如果重新定義non-virtual設計便出現矛盾

private base class繼承而來的所有成員,在derived class中都會變成private屬性,縱使它們在base class中原本是protected或是public屬性。private繼承意味著根據某物實現出,如果class d private 繼承class b,用意是為了採用class b內已經具備的某些特性,不是因為b物件和d物件存在任何觀念上的關係

當base class是乙個空類時(只含typedef或者static成員變數或者non-virtual函式時),選擇private繼承而不是復合,因為復合是base class會有乙個位元組大小然後會根據記憶體對齊進行調整,private繼承不會增加derived class大小;或者當需要訪問base class成員或者重寫virtual函式時,採用private繼承,否則盡量用復合

非必要盡量不使用virtual bases;如果必須使用virtual base class,盡可能避免在其中放置資料

第六章筆記

頂層const與底層const的區別 頂層const是指標物件本身是乙個常量,而底層const是指標所指的物件是乙個常量,理解起來就相當於前者是直接,後者是間接。宣告函式可以多次,但是每個形參只能用實參預設初始化一次,即後續宣告只可以為未預設初始化的形參新增預設實參,而且其形參右側的所有形參必須都有...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...

第六章 學習筆記

1.引數分為位置引數和關鍵字引數。def func positional para x,y,z passdef func keyword para kwd1 1,kwd2 4,kwd3 9 pass2.1 當有多個位置引數時,可以用乙個星號來收集引數,函式內使用這些位置引數時可以通過for 迴圈依次...