C 多型 過載重寫重定義 純虛函式和抽象類

2021-09-25 10:27:43 字數 3356 閱讀 1742

多型:一種呼叫語句有多種表現形態

錯誤示例

class parent

void

print()

private:

int a;};

class child: public parent

void

print()

private:

int b;};

intmain()

解決方案:用virtual關鍵字 

注意:如果使用了virtual關鍵字,但是兩個類中的函式原型不一樣,也不會發生多型。

函式原型指的是函式的頭。

class parent

virtual void

print()

private:

int a;};

class child: public parent

virtual void

print()

private:

int b;};

intmain()

物件導向三大思想:封裝、繼承、多型

實現多型三個條件:

1 要有繼承

2 要有函式重寫virtual

3用父類指標或引用指向子類物件

虛析構函式

建構函式不能是虛函式,建立乙個派生類物件時,必須從類層次的根開始,

沿著繼承路徑逐個呼叫基類的建構函式

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

class a~a

()private:

char

*p;}

; class b: public a~b

()private:

char

*p;}

;class c: public b~c

()private:

char

*p;}

;void

how_to_delete

(a *base)

intmain()

過載、重寫、重定義

過載必須在乙個類的內部;子類無法過載父類的函式,父類同名函式被覆蓋;

過載實在編譯期間根據引數型別和個數呼叫。

重寫發生字父類和子類的兩個類之間。

重寫分為兩類

1 虛函式重寫,使用virtual關鍵字,發生多型;多型是在執行期間根據物件具體的型別決定呼叫

2 非虛函式重寫 不使用virtual關鍵字(叫重定義)

class parent

public:

三個函式是過載的關係

virtual void

func()

virtual void

func

(int i)

virtual void

func

(int i,

int j)};

class child: public parent

virtual void

func

(int i,

int j,

int k)

public:

void

abc(

) 兩個類中的abc函式為重寫中的非虛函式重寫(重定義),覆蓋;但可用域作用符呼叫父類函式 };

intmain()

多型原理研究

多型成立的三個條件:1、繼承。2、虛函式重寫virtual。3、父類指標(或引用)指向子類物件。

class parent

virtual void

print()

private:

int a;};

class child : public parent

virtual void

print()

private:

int b;};

void

how_to_play

(parent *base)

intmain()

多型的實現原理

當類中宣告虛函式時,編譯器會在類中生成乙個虛函式表

虛函式表是乙個儲存類成員函式指標的資料結構

虛函式表由編譯器自動生成和維護

virtual成員函式會被編譯器放在虛函式表中

存在虛函式時,每個物件都有乙個直線跟虛函式表的指標(vptr指標)

加入virtual函式的類定義的物件,會多乙個vptr指標,其所佔記憶體比沒有

virtual的多4個位元組

物件在建立時,有編譯器對vptr指標進行初始化,只有當物件的建構函式完全結束時,vptr指標才最終確定

父類物件的vptr指標只能指向父類虛函式表,子類的只能指向子類虛函式表

class parent

virtual void

print()

}; class child: public parent

virtual void

print()

};intmain()

純虛函式和抽象類

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

純虛函式為派生類提供了乙個公共的介面

純虛函式說明形式:virtual 型別 函式名(參數列)=0

乙個具有純虛函式的基類為抽象類

#include

using namespace std;

class parent

;class circle: public parent

virtual void

get_area()

private:

int r;};

class tringle: public parent

virtual void

get_area()

private:

int a;

int h;};

void

play

(parent *base)

intmain()

C 多型 過載重寫和重定義

c 中物件導向3大概念 封裝 突破c函式的概念 用類做函式引數的時候,可以使用物件的屬性 和物件的方法 繼承 a b 復用 多型 可以使用未來 實現多型的三個條件 1 要有繼承 2 要有虛函式重寫 3 用父類指標 父類引用 指向子類物件 class parent virtual void print...

C 過載 重寫 重定義 多型

多型是基於對抽象方法的覆蓋來實現的,用統一的對外介面來完成不同的功能。過載也是用統一的對外介面來完成不同的功能。那麼兩者有什麼區別呢?也叫覆蓋,子類重新定義父類中有相同名稱相同引數的虛函式,主要是在繼承關係中出現的,被重寫的函式必須是virtual的,重寫函式的訪問修飾符可以不同,儘管virtual...

C 函式重定義 過載 重寫

c 的重寫,過載,重定義 1.重寫 override 又稱覆蓋 父類與子類之間的多型性。子類重新定義父類中有相同名稱和引數的虛函式。1 被重寫的函式不能是 static 的。必須是 virtual 的,或者是 override 的 即函式在最原始的基類中被宣告為 virtual c 中沒有 over...