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;

}

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


目录
相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
28天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
45 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
23 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
157 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
30 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4