多态进阶--纯虚函数 抽象类

文章介绍了C++中的纯虚函数和抽象类的概念,展示了如何通过纯虚函数创建抽象类,以及抽象类在多态中的作用。通过制作饮品的案例,说明了多态在代码组织和扩展性方面的优势,强调了多态可以简化代码维护和扩展。
摘要由CSDN通过智能技术生成

多态进阶–纯虚函数 抽象类

1.解读

#include<iostream>
using namespace std;

//纯虚函数  抽象类

class Base
{
public:
	//virtual void open()       //在父类中open函数仅仅是为了子类对其重写,并不使用,因此对他编写无意义
	//{				//因此将它变成一个纯虚函数

	//}
	virtual void open() = 0; //只需 virtual 函数返回值 函数名(形参表)=0;就可以将其变为纯虚函数
	//不过此时父类也会发生变化   只要一个类中存在纯虚函数,这个类就被称作抽象类
	/*抽象类具有如下特点:
	(1)首先,抽象类不允许实例化对象,也就是下面操作会报错
	Base x;
	(2)其次,如果子类只是单纯继承抽象父类,并未对父类的纯虚函数进行重写,哪怕子类有新成员也不行,子类也会成为抽象类
	*/
};
class Door :public Base
{
public:
	void open()
	{
		cout << "open Door" << endl;
	}
};
class Window :public Base
{
public:
	void open()
	{
		cout << "open Window" << endl;
	}
	void hh()
	{
		cout << "HH" << endl;
	}
};
void test02()
{
	//Base x;
	Door x;
	x.open();
	Window h;
	h.open();
}
void test03()
{
	Base* ptr = NULL;//多态目的其实重在一个函数指针,进行多个函数调用
	ptr = new Door;
	ptr->open();
	delete ptr;
	ptr = new Window;
	ptr->open();
}
int main03()
{
	//test02();
	test03();
	return 0;
}

2.案例使用

#include<iostream>
using namespace std;

//制作饮品
/*1.煮水
2.放料
3.佐料
4.入杯*/
class Make_drinks
{
public:
	//煮水
	virtual void Boil() = 0;
	//放料
	virtual void Put_material() = 0;
	//佐料
	virtual void Seasoning() = 0;
	//入杯
	virtual void Pour_out() = 0;
	//封装在一起
	void makedrink()
	{
		Boil();
		Put_material();
		Seasoning();
		Pour_out();
		
	}
};
class Tea :public Make_drinks
{	//煮水
	virtual void Boil()
	{
		cout << "正在煮水ing..." << endl;
	}
	//放料
	virtual void Put_material()
	{
		cout << "放入茶叶ing..." << endl;
	}
	//佐料
	virtual void Seasoning()
	{
		cout << "加入白糖" << endl;
	}
	//入杯
	virtual void Pour_out()
	{
		cout << "已将茶入杯,请品尝" << endl;
	}
};
class Coffee :public Make_drinks
{	//煮水
	virtual void Boil()
	{
		cout << "正在煮水ing..." << endl;
	}
	//放料
	virtual void Put_material()
	{
		cout << "放入Coffee ing..." << endl;
	}
	//佐料
	virtual void Seasoning()
	{
		cout << "加入白糖&Milk" << endl;
	}
	//入杯
	virtual void Pour_out()
	{
		cout << "已将Coffee入杯,请品尝" << endl;
	}
};
class MilkTea :public Make_drinks
{	//煮水
	virtual void Boil()
	{
		cout << "正在煮水ing..." << endl;
	}
	//放料
	virtual void Put_material()
	{
		cout << "放入茶叶&Milk(doge)ing..." << endl;
	}
	//佐料
	virtual void Seasoning()
	{
		cout << "加入白糖" << endl;
	}
	//入杯
	virtual void Pour_out()
	{
		cout << "已将Milk茶入杯,请品尝" << endl;
	}
};
//  
void MakeDrink(Make_drinks* ptr) //将父类指针作为形参 
{
	ptr->makedrink();
}
//
void make(Make_drinks& ptr)
{
	ptr.makedrink();
}
void test04()
{
	MakeDrink(new Tea);//而 把new 子类对象作为实参传递
	//实际上 实现了 Make_drinks * ptr = new Tea 是父类指针指向子类对象
	make(*(new MilkTea));//而用引用需要先构造一个对象 或者用解引用把new 出来的指针变为对象,都比较麻烦
}
int main()
{
	test04();
}

3.多态优点

代码组织清晰

  • 可读性强
  • 利于前期与后期对程序的扩展与维护,不需要动用源代码,只对需要改变的一类重新修改

以上面的案例为例,可以看出,将制作饮品的公共步骤抽象出来后,再运用多态,那么对于不同饮品的制作,只需要再新建一个子类就可以实现,改变某个饮品的制作步骤,也不需要对全篇的代码进行修改,只用在其对应的子类对象修改即可。
比如 如果想扩展一个做可乐之类,也很容易,只要在后面添加做可乐的子类就ok了。

以上就是对多态的进一步认识,希望对大家有所作用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值