多态的优点:
如果想扩展新的功能,不需要修改源码,遵循开发中开闭原则,只需在补充所需对象,直接调用即可。
开闭原则:对扩展进行开放,对修改进行关闭。
总结:C++开发提倡利用多态设计程序架构,因为多态优点很多
案例描述:
制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料
利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶。
#include<iostream>
using namespace std;
//父类:抽象制作饮品过程
class AbstractDrinking {
public:
//烧水
virtual void Boil() = 0;//纯虚函数
//冲泡
virtual void Brew() = 0;
//倒入杯中
virtual void PourInCup() = 0;
//加入辅料
virtual void PutSomething() = 0;
//规定流程
void MakeDrink() {
Boil();
Brew();
PourInCup();
PutSomething();
}
};
//子类一:制作咖啡
class Coffee : public AbstractDrinking {
public:
//重写纯虚函数
//烧水
virtual void Boil() {
cout << "煮农夫山泉!" << endl;
}
//冲泡
virtual void Brew() {
cout << "冲泡咖啡!" << endl;
}
//倒入杯中
virtual void PourInCup() {
cout << "将咖啡倒入杯中!" << endl;
}
//加入辅料
virtual void PutSomething() {
cout << "加入牛奶!" << endl;
}
};
//子类二:制作茶水
class Tea : public AbstractDrinking {
public:
//重写纯虚函数
//烧水
virtual void Boil() {
cout << "煮自来水!" << endl;
}
//冲泡
virtual void Brew() {
cout << "冲泡茶叶!" << endl;
}
//倒入杯中
virtual void PourInCup() {
cout << "将茶水倒入杯中!" << endl;
}
//加入辅料
virtual void PutSomething() {
cout << "加入枸杞!" << endl;
}
};
//业务函数
//父类指针指向子类对象
void DoWork(AbstractDrinking* drink) {
drink->MakeDrink();
delete drink;
}
void test01() {
DoWork(new Coffee);
cout << "--------------" << endl;
DoWork(new Tea);
}
int main() {
test01();
system("pause");
return 0;
}
案例描述:
电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储);
将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商…
创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口;
测试组装三台不同的电脑进行工作.
总代码:
#include<iostream>
using namespace std;
//抽象零件类
class CPU
{
public:
//抽象CPU计算函数
virtual void calculate() = 0;//纯虚函数
};
class Graphics_card//显卡
{
public:
//抽象显卡显示函数
virtual void display() = 0;//纯虚函数
};
class Memory
{
public:
//抽象内存存储函数
virtual void storage() = 0;//纯虚函数
};
//生产厂商
//Intel厂商生产零件类
class IntelCpu:public CPU
{
public:
void calculate()
{
cout << "Intel的CPU提供计算!" << endl;
}
};
class IntelCard :public Graphics_card
{
public:
void display()
{
cout << "Intel的显卡提供显示!" << endl;
}
};
class IntelMem : public Memory
{
public:
void storage()
{
cout << "Intel的内存条提供存储!" << endl;
}
};
//Lenovo厂商生产零件类
class LenovoCpu :public CPU
{
public:
void calculate()
{
cout << "Lenovo的CPU提供计算!" << endl;
}
};
class LenovoCard :public Graphics_card
{
public:
void display()
{
cout << "Lenovo的显卡提供显示!" << endl;
}
};
class LenovoMem : public Memory
{
public:
void storage()
{
cout << "Lenovo的内存条提供存储!" << endl;
}
};
class Computer
{
public:
//初始化:选择零件厂商
Computer(CPU* cpu,Graphics_card* card,Memory* mem)
{
m_cpu=cpu;
m_card=card;
m_mem=mem;
}
//执行工作
void func()
{
//零件工作,调用接口
m_cpu->calculate();
m_card->display();
m_mem->storage();
}
//释放三个零件所开辟的空间
~Computer()
{
//释放CPU零件
if (m_cpu != NULL)
{
delete m_cpu;
m_cpu = NULL;
}
//释放显卡零件
if (m_card != NULL)
{
delete m_card;
m_card = NULL;
}
//释放内存条零件
if (m_mem != NULL)
{
delete m_mem;
m_mem = NULL;
}
}
private:
//各零件指针
CPU* m_cpu;
Graphics_card* m_card;
Memory* m_mem;
};
void test01()
{
//第一台电脑零件——全部Intel零件
CPU* intelCpu = new IntelCpu;
Graphics_card* intelCard = new IntelCard;
Memory * intelMem= new IntelMem;
cout << "第一台电脑开始工作:" << endl;
//创建第一台电脑
Computer* computer1 = new Computer(intelCpu,intelCard,intelMem);
computer1->func();
delete computer1;
cout << "-----------------------" << endl;
//第二台电脑零件——全部Lenovo零件
CPU* lenovoCpu = new LenovoCpu;
Graphics_card* lenovoCard = new LenovoCard;
Memory* lenovoMem = new LenovoMem;
cout << "第二台电脑开始工作:" << endl;
//创建第一台电脑
Computer* computer2 = new Computer(lenovoCpu, lenovoCard, lenovoMem);
computer2->func();
delete computer2;
cout << "-----------------------" << endl;
//第三台电脑零件——混合Intel和Lenovo零件
cout << "第三台电脑开始工作:" << endl;
//创建第一台电脑
Computer* computer3 = new Computer(new LenovoCpu, new IntelCard, new LenovoMem);
computer3->func();
delete computer3;
}
int main()
{
test01();
system("pause");
return 0;
}