c 多型總結

2021-08-22 17:56:56 字數 2481 閱讀 6276

1、c++中通過virtual關鍵字對多型進行支援,使用virtual宣告的函式被重寫後即可展現多型特性。

注意和虛繼承的區別。雖然用的是同乙個關鍵字,但意義完全不同。

2、多型的意義:多型可以使用未來,80年**了乙個框架,可以呼叫90年**的**。

多型是設計模式的基礎,多型是框架的基礎。

3、多型成立的條件

3.1 要有繼承

3.2 要有虛函式重寫

3.3 要有父類指標(父類引用)指向子類物件

4、演示**:

class parent

virtual void print() //給乙個成員函式 定義為 虛函式。

private:

int a;

};class child :public parent

//重定義父類函式: 發生在子類和父類之間

//當子類重寫父類的成員函式,如果父類中這個函式不是虛函式, 是函式的重定義

//當子類重寫父類的成員函式,如果父類中這個函式是 虛函式。 是函式的重寫。

virtual void print()

private:

int b;

};void myprintfunc(parent *p) // 讓父類指標指向子類物件的時候,

int main(void)

5、析構函式可以是虛的。虛析構函式用於指引 delete 運算子正確析構動態物件 。

class a

virtual void print()

virtual ~a() }

private:

char *p;

};class b : public a

//重寫

virtual void print()

virtual ~b() }

private:

char *p;//和a類的p一樣,都是個字的私有成員

};void func(a *p)//p = cp; p = &c //用父類指標指向子類物件。

void mydelete(a*p) //p->cp 父類指標指向子類物件

6、多型的實現原理:

6.1 當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表,虛函式表是乙個儲存類 成員函式指標 的資料結構,是由編譯器自動生成與維護的,virtual成員函式會被編譯器放入虛函式表中。

6.2 存在虛函式時,每個物件中都有乙個指向虛函式表的指標(vptr指標)。

6.3 通過虛函式表,指標vptr呼叫重寫函式是在程式執行時進行的,因此需要通過定址操作才能確定真正應該呼叫的函式。    而普通成員函式是在編譯時就確定了呼叫的函式。在效率上, 虛函式的效率要低很多。出於效率考慮,沒有必要將所有成員函式都宣告為虛函式。

6.4 乙個類中不管有幾個虛函式,vptr指標只會存在乙個。

7、建構函式中能否呼叫虛函式,實現多型??

不能,因為物件在建立的時,由編譯器對vptr指標進行初始化,只有當物件的構造完全結束後vptr的指向才最終確定。

父類物件的vptr指向父類虛函式表,子類物件的vptr指向子類虛函式表。

8、純虛函式:

8.1 純虛函式是乙個在基類中說明的虛函式,在基類中沒有定義,要求任何派生類都定義自己的版本。

8.2 純虛函式不需要定義,只需要申明即可。

8.3 純虛函式的語法:virtual 型別 函式名(參數列) = 0;

8.4 含有純虛函式的類,稱為抽象基類,不可實列化。 即不能建立物件,存在的意義就是被繼承,提供族類的公共介面。

8.5 如果乙個類中宣告了純虛函式,而在派生類中沒有對該函式定義,

則該虛函式在派生類中仍然為純虛函式,派生類仍然為純虛基類。

//圖形類

//擁有純虛函式的類, 就叫抽象類

class shape

;//圓類

//如果 乙個子類繼承了抽象類, 那麼一定要重寫這個純虛函式。

class circle :public shape

//重寫父類抽象類的純虛函式

virtual double getarea()

virtual void print()

private:

double r;//半徑

};//實現乙個正方形

class rect :public shape

//是乙個抽象的介面,說明圖形是有乙個得到面積方法

virtual double getarea()

//頂乙個列印面積的介面

virtual void print()

private:

double a;//邊長

};//乙個傳遞抽象類 指標的架構函式

void printarea(shape *p)

//業務層

int main(void)

c 多型總結

多型 多型可以簡單地概括為 乙個介面,多種方法 程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。接下來,我寫乙個簡單地函式來說明多型 includeusing namespace std int add int left,int right float add float left...

C 多型總結

多型繫結分兩種情況,一種是靜態繫結即編譯時多型,一種是動態繫結即執行時多型是利用過載實現的。對於非虛函式的成員來說,系統在編譯時,按照函式的引數的區別來繫結要實現的操作,在編譯時就確定了呼叫哪個函式。簡單地說,虛函式是動態繫結的基礎 動態繫結是實現執行時多型的基礎。要觸發動態繫結,需滿足兩個條件 1...

C 多型總結

多型概念 同乙個事物在不同環境下具有不同的狀態 虛函式概念 在函式返回值前加上 virtual 關鍵字 多型分類 靜態多型 早繫結 在編譯器編輯時確認要呼叫的函式 1 函式過載 2 泛型程式設計 動態多型 晚繫結 在程式執行時確認將要呼叫的函式 1 基類中存在虛函式 2 繼承當中對基類進行重寫並且 ...