1. 程式人生 > 其它 >純虛擬函式和抽象類——C++

純虛擬函式和抽象類——C++

技術標籤:C++

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

因此可以將虛擬函式改為純虛擬函式。virtual 返回值型別 函式名(引數列表)=0; 該類也成為抽象類(無法例項化物件;子類必須重寫抽象類中的純虛擬函式,否則子類也屬於抽象類)。

程式碼示例:使用相同的介面(makeDrink),完成不同的功能(只需在子類中重寫父類的虛擬函式便可)。

#include<iostream>
using namespace std;
//多型案例2——製作飲品
class AbstractDrinking
{
public:
	//煮水
	virtual void Boil() = 0;
	//沖泡
	virtual void Brew() = 0;
	//倒入杯子中
	virtual void WaterInCup() = 0;
	//加入輔料
	virtual void PutSomething() = 0;
	
	void makeDrink()
	{
		Boil();
		Brew();
		WaterInCup();
		PutSomething();
	}

};

class coffe :public AbstractDrinking
{
	//煮水
	virtual void Boil()
	{
		cout << "煮水" << endl;
	}
	//沖泡
	virtual void Brew() {
		cout << "沖泡咖啡" << endl;
	}
	//倒入杯子中
	virtual void WaterInCup()
	{
		cout << "倒入杯中" << endl;
	}
	//加入輔料
	virtual void PutSomething()
	{
		cout << "倒入牛奶和糖" << endl;
	}
};


//製作茶水
class tea :public AbstractDrinking
{
	//煮水
	virtual void Boil()
	{
		cout << "煮農夫山泉" << endl;
	}
	//沖泡
	virtual void Brew() {
		cout << "沖泡茶葉" << endl;
	}
	//倒入杯子中
	virtual void WaterInCup()
	{
		cout << "倒入杯中" << endl;
	}
	//加入輔料
	virtual void PutSomething()
	{
		cout << "倒入檸檬" << endl;
	}
};


void doWork(AbstractDrinking *abs)
{
	abs->makeDrink();
	//釋放
	delete abs;
}

void test01()
{
	//製作咖啡
	doWork(new coffe);//父類的物件或者指標指向子類
	cout << "--------------" << endl;
	doWork(new tea);
}


int main()
{
	test01();

	system("pause");
	return 0;
}

執行結果: