C 程式設計第八章

2021-09-27 07:51:29 字數 2202 閱讀 8492

靜態聯編所支援的多型性稱為編譯時的多型性。

動態聯編所支援的多型性稱為執行時的多型性。

(1)、靜態聯編中的賦值相容性及名字支配規律
類的物件和呼叫的函式一一對應,編譯時即可確定呼叫關係,從而產生編譯時的多型性。

#include using namespace std;

const double pi = 3.14159;

class point

double area()

};class circle : public point

double area()

};void main()

(2)、動態聯編的多型性

1)編譯「point *p = &c;」時,根據相容性規則檢查它的合理性,也就是檢查是否符合「派生類物件的位址可以賦給基類的指標」的指標。使用關鍵字virtual宣告point類的area函式,稱為虛函式。

虛函式(看點

當系統編譯含有虛函式的類時,建立乙個虛函式表,表中每乙個元素都指向乙個虛函式位址。此外也增加了乙個資料成員,是乙個指向該虛函式表的指標,稱為vptr。

虛函式的位址翻譯取決於物件的記憶體位址。

2)、派生類能繼承基類的虛函式表,而且只要是和基類同名的成員函式,無論是否使用virtual宣告,它們都自動成為虛函式。如果派生類沒有改寫繼承基類的虛函式,則函式指標呼叫基類的虛函式。如果派生類改寫了基類的虛函式,編譯器將重新為派生類的虛函式建立位址,函式指標會呼叫改寫過的虛函式。(看點

3)、虛函式的呼叫規則:

根據當前物件,優先呼叫物件本身的虛成員函式。

在執行期「間接」呼叫實際上欲聯編的函式。當執行到語句,p -> area(); 時,才能確定p指向的是派生類circle的物件,呼叫circle ::area()函式。

(1)、虛函式定義

一旦基類定義了虛函式,該基類的派生類中的同名函式也自動成為虛函式。(看點

虛函式只能是類中的乙個成員函式,但不能是靜態成員,關鍵字virtual宣告。(選擇題

當派生類中定義了乙個同名的成員函式時,只要該成員函式的引數個數和相應型別以及它的返回型別與基類中同名的虛函式完成一樣,則無論是否為該成員函式使用virtual,都將成為乙個虛函式。

(2)、虛函式實現多型性的條件
產生執行時的多型性有如下3個前提:

1、類之間的繼承關係滿足賦值相容性規則。

2、改寫了同名虛函式。

3、根據賦值相容性規則使用指標或引用。

滿足三條才能保證實現動態聯編。

第三條分為兩種情況:

1、按賦值相容性規則使用基類指標或引用訪問虛函式。

2、把指標或引用作為函式引數,即函式不一定是類的成員函式,可以是普通函式,而且可以過載

#include using namespace std;

const double pi = 3.14159;

class point

virtual double area()

};class circle : public point

double area()

};void display(point *p)

void display(point &p)

void main()

(3)、建構函式和析構函式呼叫虛函式

建構函式和析構函式中呼叫虛函式採用靜態聯編,即它們所呼叫的虛函式是自己的類或基類中定義的函式,但不是任何在派生類中重定義的虛函式。

#include using namespcae std;

class a

virtual void func()

~a(){}

virtual void fund()

};class b ::public a

void fun()

~b()

};class c ::public b

void func()

~c()

void fundi()

};void main()

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

C語言 第八章

這一章沒有怎麼仔細看,其實也很簡單,記住格式就行了。等不會的時候可以翻書看一下就ok了。到此為止,譚浩強的這本書已經看完一遍了,找到了10個左右的錯誤,感覺有點驚訝。後天c語言的聖經就買回來了,到時候再認真看看那本吧 評價極高啊 聖經orz 一 c語言的標準 i o庫中定義了3個 file 型指標 ...

c語言 第八章

在這裡插入 片 善於利用指標 includeint main int d 3 4 int d 3 4 pointer 1 a pointer 2 b printf a d,b d n a,b printf pointer 1 d,pointer 2 d n pointer 1,pointer 2 p...