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;

}

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


目录
相关文章
|
17天前
|
存储 编译器 数据安全/隐私保护
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
27 1
|
2月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
42 2
C++入门12——详解多态1
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
62 6
|
2月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
26 0
C++ 多线程之线程管理函数
|
2月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
33 3
|
2月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
84 1
|
2月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
267 1
|
2月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
47 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
15天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
25 2