C 深度解析 34 多型與虛函式

2021-10-02 22:33:00 字數 2011 閱讀 5878

3 小結

前一篇部落格中我們知道,當使用父類的指標(引用)指向子類物件時,子類物件退化為父類物件,只能訪問父類中的成員。也就是說父類的指標不管指向的是父類的物件還是子類的物件,呼叫的都是父類的函式。

我們希望根據實際指向的物件型別呼叫重寫函式,指標(引用)指向父類物件時呼叫父類中的成員函式,指向子類物件時呼叫子類中重寫的函式。這就是多型。

物件導向中多型的概念:

c++ 中使用 virtual 關鍵字實現多型,被 virtual 修飾的函式叫做虛函式。

程式設計實驗:多型初體驗

// 34-1.cpp

#include

using

namespace std;

class

parent};

class

child

:public parent};

void

how_to_print

(parent* p)

intmain()

父類 parent 和子類 child 都有成員函式 void print(),通過函式 void how_to_print(parent* p) 訪問類的成員函式,相當於父類的指標指向子類的物件或者父類的物件,如果沒有定義為虛函式,呼叫的都是父類的函式。將成員函式定義為虛函式,可以根據指向的物件動態呼叫對應類的成員函式。

實現多型,父類的函式要用 virtual 修飾,子類中可寫可不寫。所以第 7 行需要 virtual 修飾,第 15 行的成員函式 print() 可以用 virtual 修飾,也可以省略。

編譯執行

$ g++ 34-1.cpp -o 34-1

$ ./34-1

i am parent

i am child

使用多型就可根據指向父類指標指向的物件動態呼叫指向子類物件就呼叫子類成員函式,指向父類物件就呼叫父類成員函式。函式重寫必須實現多型,否則就沒有意義。

靜態聯編:在程式的編譯期間就能確定具體的函式呼叫,如函式過載

動態聯編:在程式實際執行後才能確定具體的函式呼叫,如函式重寫

// 34-2.cpp

#include

using

namespace std;

class

parent

virtual

void

func

(int i)

virtual

void

func

(int i,

int j)};

class

child

:public parent

void

func

(int i,

int j,

int k)};

void

run(parent* p)

intmain()

編譯執行

$ g++34-

2.cpp -o 34-2

$ ./34-

2void

func()

void

func

(int i):1

void

func

(int i,

int j):(

1,2)

void

func

(int i,

int j):3

void

func

(int i,

int j):(

1,2)

void

func

(int i,

int j)

:3

1、通過 virtual 關鍵字修飾成員函式實現多型

2、區分靜態聯編與動態聯編

c 虛函式與虛表深度解析

首先來看一下單繼承,編譯下面的 include include using namespace std class grandam class mother public grandam class daughter public mother int main 結果如下圖所示 第四個結果就是呼叫的...

C 虛函式與多型

1.1 虛函式概念 1.定義 在乙個類的成員函式前面加上virtual關鍵字,則該函式就稱為虛函式。2.如果乙個函式不是類的成員函式,則該函式不能定義為虛函式。即就是類外面不能使用virtual關鍵字 1.2 純虛函式與抽象類 1.純虛函式 在虛函式的後面加上 0 virtual void disp...

c 多型與虛函式

多型按字面的意思就是多種形態。當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多型。c 多型意味著呼叫成員函式時,會根據呼叫函式的物件的型別來執行不同的函式。下面的例項中,基類 shape 被派生為兩個類,如下所示 include using namespace std class sha...