多态进阶–纯虚函数 抽象类
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了。
以上就是对多态的进一步认识,希望对大家有所作用。