title:猫狗说话
collapse:open
```cpp
#include <iostream>
using namespace std;
 
class Animal
{
public:
    virtual void speak()//虚函数    //多态核心1virtual 地址晚绑定——运行阶段绑定
        {cout << "动物在说话" << endl;}
};
 
class Cat:public Animal
{
public:
    void speak()
        {cout << "小猫在说话" << endl;}//地址早绑定——编译阶段绑定
};
 
class Dog:public Animal
{
public:
    void speak()
        {cout << "小狗在说话" << endl;}
};
 
void doSpeak(Animal &animal)
    {animal.speak();}///多态核心2Animal &animal = [cat/dog];
 
int main()
{
    Cat cat;
    Dog dog;
    doSpeak(cat);
    dospeak(dog);
    //output:小猫在说话
    //小狗在说话
    return 0;
}
title:不利用多态
collapse:open
设计计算器
```cpp
#include<iostream>
using namespace std;
 
enum TYPE
{
    ADD,
    DEC,
    MULT,
    DIV
};
 
class Calculator
{
public:
    int getResult(std::string oper)
    {
        switch(oper)
        {
        case '+':return m_num1 + m_num2;
        case '-':return m_num1 - m_num2;
        case '*':return m_num1 * m_num2;
        case '/':return m_num1 / m_num2;
        default:break;
        }
    }
 
private:
    int m_num1, m_num2;
};
 
int main()
{
    Calculator c;
    c.m_num1 = 10;
    c.m_num2 = 10;
    cout << c.m_num1 << '+' << c.m_num2 << '=' << c.getResult("+") << endl;
    //output:10+10=20
    return 0;
}
title:利用多态设计计算器
collapse:open
```cpp
#include <iostream>
using namespace std;
 
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 multCalculator :public AbstractCalculator
{
public:
    int getResult(){return m_num1 * m_num2;}
    
};
 
class divCalculator :public AbstractCalculator
{
public:
    int getResult(){return m_num1 / m_num2;}
    
};
 
int main()
{
    AbstractCalculator *abc = new addCalculator;
    abc->m_num1 = 100;
    abc->m_num2 = 100;
    cout << abc->getResult() << endl;
    delete abc;
    
    abc = new subCalculator;
    abc->m_num1 = 100;
    abc->m_num2 = 100;
    cout << abc->getResult() << endl;
    delete abc;
    
    abc = new multCalculator;
    abc->m_num1 = 100;
    abc->m_num2 = 100;
    cout << abc->getResult() << endl;
    delete abc;
    
    abc = new divCalculator;
    abc->m_num1 = 100;
    abc->m_num2 = 100;
    cout << abc->getResult() << endl;
    delete abc;
    /*output:
    200
    0
    10000
    1
    */
}
title:制作饮品
collapse:open
```cpp
#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:
    void boil() /// 煮水
    {
        cout << "煮农夫山泉" << endl;
    }
    void brew() /// 冲泡
    {
        cout << "冲泡咖啡" << endl;
    }
    void pourInCup() /// 倒入杯中
    {
        cout << "倒入杯中" << endl;
    }
    void putSomething() /// 加入辅料
    {
        cout << "加入糖和牛奶" << endl;
    }
    void makeDrink()
    {
        boil();
        brew();
        pourInCup();
        putSomething();
    }
};
 
class Tea: public AbstractDrinking
{
public:
    void boil() /// 煮水
    {
        cout << "煮农夫山泉" << endl;
    }
    void brew() /// 冲泡
    {
        cout << "冲泡茶" << endl;
    }
    void pourInCup() /// 倒入杯中
    {
        cout << "倒入杯中" << endl;
    }
    void putSomething() /// 加入辅料
    {
        cout << "加入枸杞" << endl;
    }
    void makeDrink()
    {
        boil();
        brew();
        pourInCup();
        putSomething();
    }
};
 
//制作函数
void doWork(AbstractDrinking* abs)
{
    abs->makeDrink();
    delete abs;
}
 
int main()
{
    doWork(new Coffee);
    /*output:
    煮农夫山泉
    冲泡咖啡
    倒入杯中
    加入糖和牛奶*/
    cout << "-------------" << endl;
    doWork(new Tea);
    /*output:
    -------------
    煮农夫山泉
    冲泡茶
    倒入杯中
    加入枸杞
    */
    return 0;
}
title:多态电脑
collapse:open
 
```cpp
#include <iostream>
using namespace std;
 
class CPU
{
public:
    virtual void calculate() = 0;
};
 
class GPU
{
public:
    virtual void display() = 0;
};
 
class RAM
{
public:
    virtual void storage() = 0;
};
 
class Computer
{
public:
    Computer(CPU* cpu, GPU* gpu, RAM* ram)
    {
        m_cpu = cpu;
        m_gpu = gpu;
        m_ram = ram;
    }
 
    void work()
    {
        m_cpu->calculate();
        m_gpu->display();
        m_ram->storage();
    }
    
    ~Computer()
    {
        if(m_cpu != NULL)
        {
            delete m_cpu;
            m_cpu = NULL;
        }
        
        if(m_gpu != NULL)
        {
            delete m_gpu;
            m_gpu = NULL;
        }
        
        if(m_ram != NULL)
        {
            delete m_ram;
            m_ram = NULL;
        }
    }
    
private:
    CPU* m_cpu;
    GPU* m_gpu;
    RAM* m_ram;
};
 
//Inter
class IntelCPU: public CPU
{
public:
    virtual void calcutale(){cout << "IntelCPUstartCalculate" << endl;}
};
 
class IntelGPU: public GPU
{
public:
    virtual void display(){cout << "IntelGPUstartDisplay" << endl;}
};
 
class IntelRAM: public RAM
{
public:
    virtual void storage(){cout << "IntelRAMstartStorage" << endl;}
};
 
//Lenovo
class LenovoCPU: public CPU
{
public:
    virtual void calcutale(){cout << "LenovoCPUstartCalculate" << endl;}
};
 
class LenovoGPU: public GPU
{
public:
    virtual void display(){cout << "LenovoGPUstartDisplay" << endl;}
};
 
class LenovoRAM: public RAM
{
public:
    virtual void storage(){cout << "LenovoGPUstartStorage" << endl;}
};
 
void test01()
{
    
    CPU* intelcpu = new IntelCPU;
    GPU* intelgpu = new IntelGPU;
    RAM* intelram = new IntelRAM;
    
    //组装第一台电脑
    Computer* computer1 = new Computer(intelcpu, intelgpu, intelram);
    conputer1->work();
    delete conputer1;
    
    //组装第二台电脑
    Computer* computer2 = new Computer(
    new LenovoCPU, new LenovoGPU, new LenovoRAM
    );
    conputer2->work();
    delete conputer2;
    
    //组装第三台电脑
    Computer* computer3 = new Computer(
    new LenovoCPU, new IntelGPU, new LenovoRAM
    );
    conputer3->work();
    delete conputer3;
}
 
int main()
{
    test01();
    return 0;
}