c primer 物件導向程式設計筆記

2021-06-07 16:07:28 字數 3246 閱讀 1710

1)

動態繫結

在c++

中,通過基類的引用(或指標)呼叫虛函式時,發生動態繫結。引用(或指標)既可以指向基類物件也可以指向派生類物件。

(2)虛函式 1)

保留字virtual

只在類內部的成員函式宣告中出現,不能用在類定義體外部初相的函式定義上。 2)

派生類中虛函式的宣告必須與基類中的定義完全匹配,但有乙個例外:返回對基型別的引用(或指標)的虛函式。派生類中的虛函式可以返回基類函式型別的派生類的引用(或指標)。 1

2345

678

class

base 

; class derive: public base ; 

3)預設實參 1、

通過基類的引用或指標呼叫虛函式時,預設實參是基類宣告中的值;

2、通過派生類的指標或引用呼叫虛函式時,則預設實參是派生類宣告中的值;

這裡就會產生一種情況,通過基類的引用或指標呼叫,而實際上執行的是派生類中定義的版本,而預設實參確實基類定義的引數。 01

0203

0405

0607

0809

101112

class

base 

; class derive: public base 

; base *pbase = new derive; 

pbase->f(); //

預設實參

x=1,呼叫

derive::f() 

(3)protected成員

1)像private

成員一樣,

protected

成員不能被類的使用者訪問; 2)

像public

成員一樣,

protected

成員可被該類的派生類訪問; 01

0203

0405

0607

0809

1011

1213

class

base 

; class derive: public base 

}; 

(4)作用域

在繼承情況下,派生類的作用域巢狀在基類作用域中。在基類和派生類中使用同一名字的成員函式,在派生類作用域中派生類成員將遮蔽基類成員,即使函式原型不同。 01

0203

0405

0607

0809

101112

class

base 

; class derive: public base 

; derive *d; 

//d->f();

//error 

解決的方法有兩種,第一種是顯示使用作用域操作符,第二種使用using宣告獲得過載函式的行為

。乙個using宣告只能指定乙個名字,不能指定形參表

。有一種特殊情況,如果using宣告的函式原型在派生類中已有定義,則派生類中的函式依然會遮蔽基類中的函式。

0102

0304

0506

0708

0910

1112

//方法一:顯示使用作用域

d->base::f(); 

//方法二:使用

using

宣告class derive: public base 

; derive *d = new derive; 

d->f(); 

using

宣告的另一種作用是改變繼承成員的訪問級別,但不能使訪問級別比基類中原來指定的更寬鬆。01

0203

0405

0607

080910

class

base 

; class derive: private base ; 

對於虛函式,有兩個原則:

1、只有成員函式中的**才應該使用作用域操作符覆蓋虛函式機制;

2、派生類虛函式呼叫基類版本時,只能顯式使用作用域操作符。

(5)派生類到基類轉化的可訪問性

要確定到基類的轉換是否可訪問,可以考慮基類的

public

成員是否可訪問,如果可以,轉換是可訪問的,否則轉換是不可訪問的。

這裡可以這樣理解,如果在派生類中不能訪問基類的

public

成員,則說明派生類中不能訪問基類的任何成員(派生類中對基類那部分完全不可見且不可操作),所以

在該派生類中任何出現基類型別的成員函式(輸入形參或返回型別)、成員變數都是錯誤

,這裡包括了從該派生類到基類的轉換函式,所以不存在這樣的轉化函式(無論是預設或自己定義),也即不可訪問的。 01

0203

0405

0607

0809

1011

class

a {}; 

class aa: private a {}; 

class aaa: public aa 

; aaa aaa; 

//a a = aaa;  //error 

(6)建構函式和複製控制 1)

派生類建構函式不能初始化基類的成員且不應該對基類成員賦值

,這樣做會違反基類的介面,派生類應通過使用基類建構函式尊重基類的初始化意圖。 2)

如果派生類定義了自己的複製建構函式,該複製建構函式一般應顯式使用基類複製建構函式初始化物件的基類部分。 3)

如果派生類定義了自己的賦值操作符,則該操作符必須對基類部分顯式賦值。 4)

即使析構函式沒有工作做,繼承層次的根類也應該定義乙個虛析構函式。 01

0203

0405

0607

0809

1011

1213

1415

1617

1819

class

a     //

虛析構函式

}; class aa: public a 

aa &operator=(const aa &m)    //

賦值操作符

}; 

(7)部分知識點 1)

如果需要宣告乙個派生類,則宣告包含類名但不包含派生類列表。 2)

使用class

保留字定義的派生類預設具有

private

繼承,用

struct

保留字定義的類預設具有

public

繼承。

3)基類的友元對從該基類派生的型別沒有特殊訪問許可權

C Primer 筆記15 物件導向程式設計

動態繫結 派生類物件概念模型 允許將基類指標或引用繫結到派生類物件的基類部分上 派生類的建構函式 將某個類用作基類,則該類必須已經定義 final關鍵字阻止繼承 靜態型別 編譯時已知的型別 動態型別 表示記憶體中的物件型別,執行時才知道型別 當基類的建構函式傳遞乙個派生類物件時,建構函式只處理基類自...

C Primer 物件導向程式設計

1.要注意區分類和類物件,物件只能訪問public成員,而類和友元可以訪問private成員。而對於基類的protected成員,派生類可以訪問其基類的protected成員 友元中也可以訪問protected成員 不能通過派生類物件在類外訪問protected成員 這點與private類似 值得注...

c primer 物件導向程式設計

1.重構現象 因為派生類的建構函式只能初始化它的直接基類,所以這樣就出現了一種新的現象 重構,重構是很常見的,它是指在子類中重新定義父類的建構函式,已達到自己想要的建構函式。重構要注意的是一旦被重構,編譯器必須重新編譯這些類的 class pp class d1 public base class ...