C++多态纯虚函数和抽象类与多态案例(二)-制作饮品


纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容

因此可以将虚函数改为纯虚函数

纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;

当类中有了纯虚函数,这个类也称为==抽象类==

抽象类特点

  • 无法实例化对象

  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

示例:

class Base
{
public:
    //纯虚函数
    //类中只要有一个纯虚函数就称为抽象类
    
    //抽象类特点:
    //抽象类无法实例化对象
    //子类必须重写父类中的纯虚函数,否则也属于抽象类
    virtual void func() = 0;
};
​
class Son :public Base
{
public:
    virtual void func() //子类必须重写父类中的纯虚函数,否则子类无法实例化对象。
    {
        cout << "func调用" << endl;
    };
};
​
void test01()
{
    Base * base = NULL;
    //base b; // 错误,抽象类无法实例化对象
    //base = new Base; // 错误,抽象类无法实例化对象
    base = new Son;
    base->func();
    delete base;//记得销毁
}
​
int main() {
​
    test01();
​
    system("pause");
​
    return 0;
}

写虚函数和纯虚函数就是想用多态,目的就是想让子类重写父类中的虚函数。

4.7.4 多态案例二-制作饮品

案例描述:

制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料

利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶

示例:

#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;
}

像制作其他的饮品且制作方法类似时我们就可以使用多态,想要添加新的饮品时不需要动原来的代码,很方便。

你可能感兴趣的:(C++,c++,开发语言,html,java)