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...