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


    #include
    using namespace std;
    #include

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

    //普通写法
    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
    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
    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;
    }

  • 相关阅读:
    堆排序与优先队列
    亲测快捷高效的编写测试用例方法
    echarts多个关系图如何实现
    2216.美化数组的最少删除数
    ALevel物理例题解析(1)
    cmd使用ssh连接Linux脚本
    2、HTML基础 _列表、表格、表单标签和input、button按钮、select下拉菜单、textarea文本域、label标签
    PostgreSQL的学习心得和知识总结(九十一)|深入理解PostgreSQL数据库开源MPP扩展Citus的安装过程及其Makefile的理解
    LinkedList
    CIKM 2022 AnalytiCup Competition: 联邦异质任务学习
  • 原文地址:https://blog.csdn.net/AAAAAB111/article/details/136124736