C 核心程式設計 4 類和物件 多型(7)

2022-09-20 14:51:10 字數 4088 閱讀 4096

4.7 多型

4.7.1 多型的基本概念

多型是c++物件導向三大特性之一,多型分為兩類:靜態多型、動態多型。

靜態多型:函式過載和運算子過載屬於靜態多型,復用函式名

動態多型:派生類和虛函式實現執行時多型

區別:靜態多型的函式位址早繫結 - 編譯階段確定函式位址

動態多型的函式位址晚繫結 - 執行階段確定函式位址

#includeusing

namespace

std;

//多型

//動物類

class

animal

};//

貓類class cat :public

animal

};//

狗類class dog :public

animal

};//

執行說話的函式

//位址早繫結 在編譯階段確定了函式位址

//如果想執行讓貓說話,那麼這個函式位址就不能提前繫結,需要在執行階段進行繫結,既位址晚繫結 改為虛函式即可

//動態多型滿足條件:1、有繼承關係 2、子類重寫父類的虛函式

//動態多型使用 父類的指標或引用 執行子類物件

void dospeak(animal &animal) //

animal &animal = cat -> animal的引用指向cat 父類的引用指向子類

void

test1()

intmain()

總結:多型滿足條件

1、有繼承關係

2、子類重寫父類中的虛函式

多型使用條件

1、父類指標或引用

//分別用普通寫法和多型技術 實現計算器

//普通寫法

class

calculator

else

if(oper == "-"

)

else

if (oper == "*"

)

else

if (oper == "/"

)

//如果想擴充套件新功能,需要修改原始碼

//在真實開發中 提倡 開閉原則

//開閉原則:對擴充套件進行開放,對修改進行關閉

}

int m_num1; //

運算元1

int m_num2; //

運算元2

};//

多型技術

//多型好處:1、組織結構清晰 2、可讀性強 3、對於前後期的維護和擴充套件高

//實現計算器抽象類

class

abstractcalculator

intm_num1;

intm_num2;

};//

加法計算器類

class addcalculator :public

abstractcalculator

};//

減法計算器類

class subcalculator :public

abstractcalculator

};//

乘法計算器類

class mulcalculator :public

abstractcalculator

};//

除法計算器類

class chucalculator :public

abstractcalculator

};void

test1()

void

test2()

intmain()

4.7.3 純虛函式和抽象類

在多型中,通常父類中虛函式的實現是毫無意義的,主要都是呼叫子類重寫的內容,因此可以將虛函式1改為純虛函式。

純虛函式語法:virtual 返回值型別 函式名 (引數列表)= 0;

當類中有了純虛函式,這個類也稱為抽象類。

抽象類特點:

1、無法例項化物件

2、子類必須重寫抽象類中的純虛函式,否則也屬於抽象類

#includeusing

namespace

std;

class

base

;class son :public

base;};

void

test1()

intmain()

案例 做飲料

#includeusing

namespace

std;

//多型案例2 製作飲品

class

abstractdrinking

};//

製作咖啡

class coffee :public

abstractdrinking

//沖泡

virtual

void

brew()

//倒入杯中

virtual

void

pourincup()

//加入佐料

virtual

void

putsomething()

};//

製作茶葉水

class tea :public

abstractdrinking

//沖泡

virtual

void

brew()

//倒入杯中

virtual

void

pourincup()

//加入佐料

virtual

void

putsomething()

};//

製作void dowork(abstractdrinking * abs) //

abstractdrinking * abs = new coffee

void

test1()

intmain()

4.7.5 虛析構和純虛析構

多型使用時,如果子類中有屬性開闢到堆區,那麼父類指標在釋放時無法呼叫到子類的析構**

解決辦法:將父類中的析構函式改為虛析構或者純虛析構

虛析構和純虛析構共性:

1、可以解決父類指標釋放子類物件

2、都需要具體的函式實現

區別:如果是純虛析構,該類屬於抽象類,無法例項化物件

虛析構語法: virtual ~類名(){}

純虛析構語法:virtual ~類名() = 0

#include#include

using

namespace

std;

//虛析構和純虛析構

class

animal

////利用虛析構可以解決 父類指標釋放子類物件時不乾淨的問題

//virtual ~animal()

//

//純虛析構 需要宣告也需要實現

//有了純虛析構之後 這個類也屬於抽象類 無法例項化物件

virtual ~animal() = 0; //

如果沒有第27-30行的類外宣告,**將無法執行 因為沒實現就不能執行父類的析構

//純虛函式

virtual

void speak() = 0;};

animal::~animal()

class cat :public

animal

virtual

void

speak()

~cat()

}string *m_name;

};void

test1()

intmain()

案例2 電腦組裝

C 核心程式設計 4 類和物件 封裝

c 物件導向的三大特性 封裝 繼承 多型 c 認為萬事萬物皆為物件,物件上有其屬性和行為 封裝意義 1 將屬性和行為作為乙個整體,表現生活中的事物 語法 class 類名 例項 設計乙個圓類,求圓的周長 include include using namespace std 設計乙個圓類,求圓的周長...

C 核心程式設計 4 類和物件 友元

黑馬程式設計師匠心之作 c 教程從0到1入門程式設計 學習筆記 本階段主要針對c 物件導向程式設計技術做詳細講解,c 中的核心和精髓 在程式裡,有些私有屬性,也想讓類外特殊的一些函式或者類進行訪問,就需要用到友元的技術。友元的目的就是讓乙個函式或者類,訪問另乙個類中的私有成員。友元的關鍵字為frie...

C 核心程式設計 04類和物件 封裝

c 物件導向程式設計的三大特徵為 封裝 繼承 多型 c 認為萬事萬物皆為物件,物件上有其屬性和行為 封裝是c 物件導向三大特性之一 封裝的意義 1 將屬性和行為作為乙個整體,表現生活中的事物 2 將屬性和行為加以許可權控制 封裝意義一 在設計類的時候,屬性和行為寫在一起,表現事物 語法 class ...