C++多态纯虚函数和抽象类与多态案例(二)

简介: 纯虚函数和抽象类在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容因此可以将虚函数改为纯虚函数纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;当类中有了纯虚函数,这个类也称为==抽象类==抽象类特点:• 无法实例化对象• 子类必须重写抽象类中的纯虚函数,否则也属于抽象类



纯虚函数和抽象类

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

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

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

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

抽象类特点

  • 无法实例化对象
  • 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

示例:

classBase

{

public:

   //纯虚函数

   //类中只要有一个纯虚函数就称为抽象类

   

   //抽象类特点:

   //抽象类无法实例化对象

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

   virtualvoidfunc() =0;

};

classSon :publicBase

{

public:

   virtualvoidfunc() //子类必须重写父类中的纯虚函数,否则子类无法实例化对象。

   {

       cout<<"func调用"<<endl;

   };

};

voidtest01()

{

   Base*base=NULL;

   //base b; // 错误,抽象类无法实例化对象

   //base = new Base; // 错误,抽象类无法实例化对象

   base=newSon;

   base->func();

   deletebase;//记得销毁

}

intmain() {

   test01();

   system("pause");

   return0;

}

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

4.7.4 多态案例二-制作饮品

案例描述:

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

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

示例:

#include<iostream>

usingnamespacestd;

//抽象制作饮品

classAbstractDrinking {

public:

   //烧水

   virtualvoidBoil() =0;

   //冲泡

   virtualvoidBrew() =0;

   //倒入杯中

   virtualvoidPourInCup() =0;

   //加入辅料

   virtualvoidPutSomething() =0;

   //规定流程

   voidMakeDrink() {

       Boil();

       Brew();

       PourInCup();

       PutSomething();

   }

};

//制作咖啡

classCoffee : publicAbstractDrinking {

public:

   //烧水

   virtualvoidBoil() {

       cout<<"煮农夫山泉!"<<endl;

   }

   //冲泡

   virtualvoidBrew() {

       cout<<"冲泡咖啡!"<<endl;

   }

   //倒入杯中

   virtualvoidPourInCup() {

       cout<<"将咖啡倒入杯中!"<<endl;

   }

   //加入辅料

   virtualvoidPutSomething() {

       cout<<"加入牛奶!"<<endl;

   }

};

//制作茶水

classTea : publicAbstractDrinking {

public:

   //烧水

   virtualvoidBoil() {

       cout<<"煮自来水!"<<endl;

   }

   //冲泡

   virtualvoidBrew() {

       cout<<"冲泡茶叶!"<<endl;

   }

   //倒入杯中

   virtualvoidPourInCup() {

       cout<<"将茶水倒入杯中!"<<endl;

   }

   //加入辅料

   virtualvoidPutSomething() {

       cout<<"加入枸杞!"<<endl;

   }

};

//业务函数

voidDoWork(AbstractDrinking*drink) {

   drink->MakeDrink();

   deletedrink;

}

voidtest01() {

   DoWork(newCoffee);

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

   DoWork(newTea);

}

intmain() {

   test01();

   system("pause");

   return0;

}

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


目录
相关文章
|
4天前
|
C++
【C++】从零开始认识多态(二)
面向对象技术(oop)的核心思想就是封装,继承和多态。通过之前的学习,我们了解了什么是封装,什么是继承。 封装就是对将一些属性装载到一个类对象中,不受外界的影响,比如:洗衣机就是对洗衣服功能,甩干功能,漂洗功能等的封装,其功能不会受到外界的微波炉影响。 继承就是可以将类对象进行继承,派生类会继承基类的功能与属性,类似父与子的关系。比如水果和苹果,苹果就有水果的特性。
24 1
|
4天前
|
C++
【C++】从零开始认识多态(一)
面向对象技术(oop)的核心思想就是封装,继承和多态。通过之前的学习,我们了解了什么是封装,什么是继承。 封装就是对将一些属性装载到一个类对象中,不受外界的影响,比如:洗衣机就是对洗衣服功能,甩干功能,漂洗功能等的封装,其功能不会受到外界的微波炉影响。 继承就是可以将类对象进行继承,派生类会继承基类的功能与属性,类似父与子的关系。比如水果和苹果,苹果就有水果的特性。
26 4
|
2天前
|
C++
C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类
C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类
|
4天前
|
C++ 编译器 程序员
C++ 从零基础到入门(3)—— 函数基础知识
C++ 从零基础到入门(3)—— 函数基础知识
|
4天前
|
C++ 编译器 存储
|
4天前
|
存储 C++
C++中的多态
C++中的多态
8 0
|
4天前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
36 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
4天前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
15 1
|
4天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
18 0
|
2天前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算