纯虚函数和抽象类
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
因此可以将虚函数改为纯虚函数
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;
当类中有了纯虚函数,这个类也称为==抽象类==
抽象类特点:
- 无法实例化对象
- 子类必须重写抽象类中的纯虚函数,否则也属于抽象类
示例:
classBase
{
public:
//纯虚函数
//类中只要有一个纯虚函数就称为抽象类
//抽象类特点:
//抽象类无法实例化对象
//子类必须重写父类中的纯虚函数,否则也属于抽象类
virtualvoidfunc() =0;
};
classSon :publicBase
{
public:
virtualvoidfunc() //子类必须重写父类中的纯虚函数,否则子类无法实例化对象。
{
cout<<"func调用"<<endl;
};
};
voidtest01()
{
Base*base=NULL;
//base b; // 错误,抽象类无法实例化对象
//base = new Base; // 错误,抽象类无法实例化对象
base=newSon;
base->func();
deletebase;//记得销毁
}
intmain() {
test01();
system("pause");
return0;
}
写虚函数和纯虚函数就是想用多态,目的就是想让子类重写父类中的虚函数。
4.7.4 多态案例二-制作饮品
案例描述:
制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料
利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶
示例:
#include<iostream>
usingnamespacestd;
//抽象制作饮品
classAbstractDrinking {
public:
//烧水
virtualvoidBoil() =0;
//冲泡
virtualvoidBrew() =0;
//倒入杯中
virtualvoidPourInCup() =0;
//加入辅料
virtualvoidPutSomething() =0;
//规定流程
voidMakeDrink() {
Boil();
Brew();
PourInCup();
PutSomething();
}
};
//制作咖啡
classCoffee : publicAbstractDrinking {
public:
//烧水
virtualvoidBoil() {
cout<<"煮农夫山泉!"<<endl;
}
//冲泡
virtualvoidBrew() {
cout<<"冲泡咖啡!"<<endl;
}
//倒入杯中
virtualvoidPourInCup() {
cout<<"将咖啡倒入杯中!"<<endl;
}
//加入辅料
virtualvoidPutSomething() {
cout<<"加入牛奶!"<<endl;
}
};
//制作茶水
classTea : publicAbstractDrinking {
public:
//烧水
virtualvoidBoil() {
cout<<"煮自来水!"<<endl;
}
//冲泡
virtualvoidBrew() {
cout<<"冲泡茶叶!"<<endl;
}
//倒入杯中
virtualvoidPourInCup() {
cout<<"将茶水倒入杯中!"<<endl;
}
//加入辅料
virtualvoidPutSomething() {
cout<<"加入枸杞!"<<endl;
}
};
//业务函数
voidDoWork(AbstractDrinking*drink) {
drink->MakeDrink();
deletedrink;
}
voidtest01() {
DoWork(newCoffee);
cout<<"--------------"<<endl;
DoWork(newTea);
}
intmain() {
test01();
system("pause");
return0;
}
像制作其他的饮品且制作方法类似时我们就可以使用多态,想要添加新的饮品时不需要动原来的代码,很方便。