C++类和对象-多态->案例1计算器类、案例2制作饮品、案例3电脑组装需求分析和电脑组装具体实现

#include<iostream>

using namespace std;

#include<string>

//分别利用普通写法和多态技术实现计算器

//普通写法

class Calculator {

public:

int getResult(string oper)

{

if (oper == "+") {

return m_Num1 + m_Num2;

}

else if (oper == "-") {

return m_Num1 - m_Num2;

}

else if (oper == "*") {

return m_Num1 * m_Num2;

}

//如果想扩展新的功能,需要修改源码

//在真实开发中 提供 开闭原则

//开闭原则:对扩展进行开发,对修改进行关闭

}

public:

int m_Num1;//操作数1

int m_Num2;//操作数2

};

void test01()

{

//普通实现测试

//创建计算器对象

Calculator c;

c.m_Num1 = 10;

c.m_Num2 = 10;

cout << c.m_Num1 << " + " << c.m_Num2 << " = " << c.getResult("+") << endl;

cout << c.m_Num1 << " - " << c.m_Num2 << " = " << c.getResult("-") << endl;

cout << c.m_Num1 << " * " << c.m_Num2 << " = " << c.getResult("*") << endl;

}

//利用多态实现计算器

//实现计算器抽象类

//多态优点:代码组织结构清晰,可读性强,利于前期和后期的扩展以及维护

class AbstractCalculator

{

public :

virtual int getResult()

{

return 0;

}

int m_Num1;

int m_Num2;

};

//加法计算器

class AddCalculator :public AbstractCalculator

{

public:

int getResult()

{

return m_Num1 + m_Num2;

}

};

//减法计算器

class SubCalculator :public AbstractCalculator

{

public:

int getResult()

{

return m_Num1 - m_Num2;

}

};

//乘法计算器

class MulCalculator :public AbstractCalculator

{

public:

int getResult()

{

return m_Num1 * m_Num2;

}

};

void test02()

{

//多态使用条件

//父类指针或者引用指向子类对象

//创建加法计算器

AbstractCalculator * abc = new AddCalculator;

abc->m_Num1 = 10;

abc->m_Num2 = 10;

cout << abc->m_Num1 << " + " << abc->m_Num2 << " = " << abc->getResult() << endl;

delete abc; //用完了记得销毁

//创建减法计算器

abc = new SubCalculator;

abc->m_Num1 = 10;

abc->m_Num2 = 10;

cout << abc->m_Num1 << " - " << abc->m_Num2 << " = " << abc->getResult() << endl;

delete abc;

//创建乘法计算器

abc = new MulCalculator;

abc->m_Num1 = 10;

abc->m_Num2 = 10;

cout << abc->m_Num1 << " * " << abc->m_Num2 << " = " << abc->getResult() << endl;

delete abc;

}

int main() {

//test01();

test02();

system("pause");

return 0;

}

总结: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;

}

#include<iostream>

using namespace std;

//抽象不同零件类

//抽象CPU类

class CPU

{

public:

//抽象的计算函数

virtual void calculate() = 0;

};

//抽象显卡类

class VideoCard

{

public:

//抽象的显示函数

virtual void display() = 0;

};

//抽象内存条类

class Memory

{

public:

//抽象的存储函数

virtual void storage() = 0;

};

//电脑类

class Computer

{

public:

Computer(CPU * cpu, VideoCard * vc, Memory * mem)

{

m_cpu = cpu;

m_vc = vc;

m_mem = mem;

}

//提供工作的函数

void work()

{

//让零件工作起来,调用接口

m_cpu->calculate();

m_vc->display();

m_mem->storage();

}

//提供析构函数 释放3个电脑零件

~Computer()

{

//释放CPU零件

if (m_cpu != NULL)

{

delete m_cpu;

m_cpu = NULL;

}

//释放显卡零件

if (m_vc != NULL)

{

delete m_vc;

m_vc = NULL;

}

//释放内存条零件

if (m_mem != NULL)

{

delete m_mem;

m_mem = NULL;

}

}

private:

CPU * m_cpu; //CPU的零件指针

VideoCard * m_vc; //显卡零件指针

Memory * m_mem; //内存条零件指针

};

//具体厂商

//Intel厂商

class IntelCPU :public CPU

{

public:

virtual void calculate()

{

cout << "Intel的CPU开始计算了!" << endl;

}

};

class IntelVideoCard :public VideoCard

{

public:

virtual void display()

{

cout << "Intel的显卡开始显示了!" << endl;

}

};

class IntelMemory :public Memory

{

public:

virtual void storage()

{

cout << "Intel的内存条开始存储了!" << endl;

}

};

//Lenovo厂商

class LenovoCPU :public CPU

{

public:

virtual void calculate()

{

cout << "Lenovo的CPU开始计算了!" << endl;

}

};

class LenovoVideoCard :public VideoCard

{

public:

virtual void display()

{

cout << "Lenovo的显卡开始显示了!" << endl;

}

};

class LenovoMemory :public Memory

{

public:

virtual void storage()

{

cout << "Lenovo的内存条开始存储了!" << endl;

}

};

void test01()

{

//第一台电脑零件

CPU * intelCpu = new IntelCPU;

VideoCard * intelCard = new IntelVideoCard;

Memory * intelMem = new IntelMemory;

cout << "第一台电脑开始工作:" << endl;

//创建第一台电脑

Computer * computer1 = new Computer(intelCpu, intelCard, intelMem);

computer1->work();

delete computer1;

cout << "-----------------------" << endl;

cout << "第二台电脑开始工作:" << endl;

//第二台电脑组装

Computer * computer2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);

computer2->work();

delete computer2;

cout << "-----------------------" << endl;

cout << "第三台电脑开始工作:" << endl;

//第三台电脑组装

Computer * computer3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory);

computer3->work();

delete computer3;

}

int main()

{

test01();

system("pause");

return 0;

}

相关推荐
家有狸花13 分钟前
VSCODE驯服日记(三):配置C++环境
c++·ide·vscode
dengqingrui12335 分钟前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝37 分钟前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O1 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
吾爱星辰3 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
ChinaDragonDreamer3 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin
IT良3 小时前
c#增删改查 (数据操作的基础)
开发语言·c#
小飞猪Jay3 小时前
C++面试速通宝典——13
jvm·c++·面试
Kalika0-04 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
_.Switch4 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j