20. 纯虚函数和抽象类

在多态中,通常父类中的虚函数实现是毫无意义的,主要是调用子类重写的内容因此可以将虚函数改为纯虚函数

  1. 纯虚函数语法:virtual 返回值类型 函数名(参数列表)= 0;
  2. 当类中有了纯虚函数,这个类也成为抽象类
  3. 抽象类特点
  • 无法实例化对象
  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

#include <iostream>
using namespace std;
//纯虚函数和抽象类
class Base
{
public:
      //只要有一个纯虚函数,这个类就是抽象类
      //1.无法实例化对象(没办法写对象)
      virtual void func() = 0;
};
class Son:public Base
{
public:
      virtual void func()
      {
            cout << "func函数调用" << endl;
      };
};
void test01()
{
     //Base b; //无法实例化对象,会报错

      Son s; //子类必须重写父类中的纯虚函数,否则无法实例化对象
      
      //利用多态的技术调用:指针或引用调用接口
      Base *base =new Son;
      base -> func();
}
int main()
{
      test01();
      system("pause");
      return 0;
}
  1. 小案例:制作冷饮
    案例描述:煮水、冲泡、倒杯中、加入辅料,利用多态实现
#include <iostream>
using namespace std;
class abstractdrinking
{
public:
      //煮水
      virtual void Boil () = 0;
      //冲泡
      virtual void Brew () = 0;
      //倒入杯中
      virtual void Pour () = 0;
      //加入辅料
      virtual void putsomething () = 0;

      //制作饮品
      void makeDrink() //接口
      {
            Boil();
            Brew ();
            Pour () ;
            putsomething ();
      }
};
class  Coffee:public abstractdrinking
{
public:
      //煮水
      virtual void Boil () 
      {
            cout << "煮农夫山泉" << endl;
      }
      //冲泡
      virtual void Brew ()
      {
            cout << "冲泡咖啡" << endl;
      }
      //倒入杯中
      virtual void Pour()
      {
            cout << "倒入杯中" << endl;
      }
      //加入辅料
      virtual void putsomething () 
      {
            cout << "加入牛奶" << endl;
      }
};

class  Tea : public abstractdrinking
{
public:
      //煮水
      virtual void Boil() 
      {
            cout << "煮山泉" << endl;
      }
      //冲泡
      virtual void Brew()
      {
            cout << "冲泡茶叶" <<endl;
      }
      //倒入杯中
      virtual void Pour()
      {
            cout << "倒入杯中" << endl;
      }
      //加入辅料
      virtual void putsomething() 
      {
            cout << "加入枸杞" << endl;
      }
};
//制作函数,调用父类中的制作接口
void dowork(abstractdrinking *abs)
{
      abs->makerDrink();  //一个接口多种形态,实现了多态
      delete abs;  //堆区开辟记得释放
}
void test01()
{
      dowork(new Coffee);
      dowork(new Tea);
}
int main()
{
      tets01();
      system("pause");
      return 0;
}

小结:拥有纯虚函数的一定是父类(无法被实例化),且子类必须实现这个函数,否则还是抽象类

posted @ 2020-06-16 10:03  by1314  阅读(178)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end