C 學習筆記 多型

2021-10-22 18:41:16 字數 4485 閱讀 9051

1、多型的基本概念

多型是c++物件導向三大特性之一

多型分為兩類

靜態多型和動態多型區別:

下面通過案例進行講解多型

class animal

};class cat :public animal

};class dog :public animal

};//我們希望傳入什麼物件,那麼就呼叫什麼物件的函式

//如果函式位址在編譯階段就能確定,那麼靜態聯編

//如果函式位址在執行階段才能確定,就是動態聯編

void dospeak(animal & animal)

////多型滿足條件:

//1、有繼承關係

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

//多型使用:

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

void test01()

int main()

總結:

多型滿足條件

多型使用條件

重寫:函式返回值型別 函式名 引數列表 完全一致稱為重寫

2、多型案例一-計算器類

案例描述:

分別利用普通寫法和多型技術,設計實現兩個運算元進行運算的計算器類

多型的優點:

示例:

//普通實現

class calculator

else if (oper == "-")

else if (oper == "*")

//如果要提供新的運算,需要修改原始碼

}public:

int m_num1;

int m_num2;

};void test01()

//多型實現

//抽象計算器類

//多型優點:**組織結構清晰,可讀性強,利於前期和後期的擴充套件以及維護

class abstractcalculator

int m_num1;

int m_num2;

};//加法計算器

class addcalculator :public abstractcalculator

};//減法計算器

class subcalculator :public abstractcalculator

};//乘法計算器

class mulcalculator :public abstractcalculator

};void test02()

int main()

總結:c++開發提倡利用多型設計程式架構,因為多型優點很多

3 純虛函式和抽象類

在多型中,通常父類中虛函式的實現是毫無意義的,主要都是呼叫子類重寫的內容

因此可以將虛函式改為純虛函式

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

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

抽象類特點

示例:

class base

;class son :public base;};

void test01()

int main()

4 多型案例二-製作飲品

案例描述:

製作飲品的大致流程為:煮水 - 沖泡 - 倒入杯中 - 加入輔料

利用多型技術實現本案例,提供抽象製作飲品基類,提供子類製作咖啡和茶葉

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-o4so6fmo-1616318138538)(assets/1545985945198.png)]

示例:

//抽象製作飲品

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* drink)

void test01()

int main()

5 虛析構和純虛析構

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

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

虛析構和純虛析構共性:

虛析構和純虛析構區別:

虛析構語法:

virtual ~類名(){}

純虛析構語法:

virtual ~類名() = 0;

類名::~類名(){}

示例:

class animal 

virtual void speak() = 0;

//析構函式加上virtual關鍵字,變成虛析構函式

//virtual ~animal()

// virtual ~animal() = 0;

};animal::~animal()

//和包含普通純虛函式的類一樣,包含了純虛析構函式的類也是乙個抽象類。不能夠被例項化。

class cat : public animal

virtual void speak()

~cat() }

public:

string *m_name;

};void test01()

int main()

總結:

​ 1. 虛析構或純虛析構就是用來解決通過父類指標釋放子類物件

​ 2. 如果子類中沒有堆區資料,可以不寫為虛析構或純虛析構

​ 3. 擁有純虛析構函式的類也屬於抽象類

6 多型案例三-電腦組裝

案例描述:

電腦主要組成部件為 cpu(用於計算),顯示卡(用於顯示),記憶體條(用於儲存)

將每個零件封裝出抽象基類,並且提供不同的廠商生產不同的零件,例如intel廠商和lenovo廠商

建立電腦類提供讓電腦工作的函式,並且呼叫每個零件工作的介面

測試時組裝三颱不同的電腦進行工作

示例:

#includeusing namespace std;

//抽象cpu類

class cpu

;//抽象顯示卡類

class videocard

;//抽象記憶體條類

class memory

;//電腦類

class computer

//提供工作的函式

void work()

//提供析構函式 釋放3個電腦零件

~computer()

//釋放顯示卡零件

if (m_vc != null)

//釋放記憶體條零件

if (m_mem != null)

}private:

cpu * m_cpu; //cpu的零件指標

videocard * m_vc; //顯示卡零件指標

memory * m_mem; //記憶體條零件指標

};//具體廠商

//intel廠商

class intelcpu :public cpu

};class intelvideocard :public videocard

};class intelmemory :public memory

};//lenovo廠商

class lenovocpu :public cpu

};class lenovovideocard :public videocard

};class lenovomemory :public memory

};void test01()

C 學習筆記 多型

引言 1.虛繼承 如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性。解決方案 虛繼承宣告,加乙個virtual 關鍵字 2.物件導向新需求 編譯器的做法不是我們期望的 如果用父類指標指向子類物件,再呼叫print 方法,均會呼叫父類中的p...

C 多型學習筆記

看了一堆介紹多型的東西,腦子裡就記得幾個概念了。靜態多型,又叫早繫結,動態多型,應該是叫晚繫結。多型的價值在於使程式更簡潔 更高效。no virtual no 多型,virtual means 已多型。不要覺得問題 很沒用 你還就是說不出來。同樣的命令,不同的物件,做出不同的動作。這就得借助the ...

c 學習筆記 多型

這裡用乙個shape類 rectangle類 cirle類進行說明 virtual shape 虛析構函式 在動態申請空間時候 防止沒析構派生類 virtual double area 虛函式有藏的效果 virtual double zhouchang private double area dou...