4.7.1 多型的基本概念
多型是c++物件導向三大特性之一
多型分為兩類
靜態多型和動態多型區別:
下面通過案例進行講解多型
class animal
};class cat :public animal
};class dog :public animal
};//我們希望傳入什麼物件,那麼就呼叫什麼物件的函式
//如果函式位址在編譯階段就能確定,那麼靜態聯編
//如果函式位址在執行階段才能確定,就是動態聯編
void dospeak(animal & animal)
////多型滿足條件:
//1、有繼承關係
//2、子類重寫父類中的虛函式
//多型使用:
//父類指標或引用指向子類物件
總結:多型滿足條件
多型使用條件
重寫:函式返回值型別 函式名 引數列表 完全一致稱為重寫
4.7.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++開發提倡利用多型設計程式架構,因為多型優點很多
4.7.3 純虛函式和抽象類
在多型中,通常父類中虛函式的實現是毫無意義的,主要都是呼叫子類重寫的內容
因此可以將虛函式改為純虛函式
純虛函式語法:virtual 返回值型別 函式名 (引數列表)= 0 ;
當類中有了純虛函式,這個類也稱為抽象類
抽象類特點:
示例:
class base
;class son :public base;};
void test01()
int main()
4.7.4 多型案例二-製作飲品
案例描述:
製作飲品的大致流程為:煮水 - 沖泡 - 倒入杯中 - 加入輔料
利用多型技術實現本案例,提供抽象製作飲品基類,提供子類製作咖啡和茶葉
示例:
//抽象製作飲品
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()
4.7.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. 擁有純虛析構函式的類也屬於抽象類
4.7.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 研發 核心篇 第四講 4 5 運算子過載
運算子過載概念 對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別 作用 實現兩個自定義資料型別相加的運算 class person person int a,int b 成員函式實現 號運算子過載 person operator const person p public int ...
爬蟲核心基礎第四講(requests庫)
pip install requests 練習兩種,第二種是裝飾器 class person def init self,name self.name name defname self return self.name p person 葫蘆娃 print p.name class person ...
C語言入門筆記 第四講 分支語句
單分支型 情況一 語法結構 if 表示式 語句 如果表示式為真,執行語句 如果表示式為假,什麼都不執行。情況二 if 表示式 語句1 else 語句2 如果表示式為真,執行語句1 如果表示式為假,執行語句2。多分支型 多分支 if 表示式1 語句1 else if 表示式2 語句2 else 語句3...