返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++多态的示例详解
  • 274
分享到

C++多态的示例详解

2024-04-02 19:04:59 274人浏览 薄情痞子
摘要

目录案例一:计算器案例要求代码实现运行效果案例二:制作饮品案例要求代码实现运行效果案例三:电脑组装案例要求代码实现运行效果今天就以三个案例来把c++多态的内容结束。第一个案例就是用多

今天就以三个案例来把c++多态的内容结束。第一个案例就是用多态写一个计算器并实现简单的加减乘除操作;第二个案例就是一个饮品制作,主要就是抽象类重写方法;第三个是比较综合的电脑组装案例,正文会详细介绍;那么就开始上手操作吧!

案例一:计算器

案例要求

使用多态实现计算器的加减乘除操作

代码实现

class AbstractCalculator
{
public:
    //纯虚函数,用来得到计算结果
    virtual void getResult() = 0;
    float num1, num2;
};
//加法类
class Add :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "+" << num2 << "=" << num1 + num2 << endl;
    }
};
//减法类
class Sub :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "-" << num2 << "=" << num1 - num2 << endl;
    }
};
//乘法类
class Mul :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "*" << num2 << "=" << num1 * num2 << endl;
    }
};
//除法类
class Des :public AbstractCalculator
{
public:
    void getResult()
    {
        cout << num1 << "/" << num2 << "=" << num1 / num2 << endl;
    }
};
void main()
{
    //1、加法
    AbstractCalculator *abc = new Add();
    abc->num1 = 2.1;
    abc->num2 = 3.9;
    abc->getResult();
    delete abc;
    //2、减法
    abc = new Sub();
    abc->num1 = 3.9;
    abc->num2 = 2.1;
    abc->getResult();
    delete abc;
    //3、乘法
    abc = new Mul();
    abc->num1 = 4.2;
    abc->num2 = 2;
    abc->getResult();
    delete abc;
    //4、除法
    abc = new Des();
    abc->num1 = 8.8;
    abc->num2 = 2;
    abc->getResult();
    delete abc;
}

代码解释 

首先创建AbstractCalculator类作为基类,设置两个浮点型属性用来做基本运算,并含有纯虚函数getResult。我们知道还有纯虚函数的类被称为抽象类,特点是无法实例化,非抽象子类必须重写抽象类的所有纯虚函数,因此基本运算的类都要重写getResult方法。接下来写了加减乘除四个派生类继承该抽象类,分别给派生类的getResult进行重写,得到不同的计算结果。主函数中利用父类指针来创建子类对象,给两个操作数赋值后调用getResult方法,然后利用delete删除指针。注意删除指针只是删除了那一块地址,该指针的类型是不变的,还可以多次利用,指向不同的子类对象。

运行效果

案例二:制作饮品

案例要求

给出制作饮品的过程为四步:把水煮开、冲泡、倒入杯中、加入佐料。

利用多态写出两个饮品的制作过程

代码实现

#include<iOStream>
using namespace std;
//使用多态制作奶茶
class AbstractDrink
{
public:
    //制作开水
    virtual void boiledWater() = 0;
    //冲泡
    virtual void brew() = 0;
    //倒入杯中
    virtual void inCup() = 0;
    //加入佐料
    virtual void pour() = 0;
    void makeDrink()
    {
        this->boiledWater();
        this->brew();
        this->inCup();
        this->pour();
    }
};
//制作咖啡
class Coffee :public AbstractDrink
{
public:
    //煮水
    virtual void boiledWater()
    {
        cout << "先把水煮开" << endl;
    }
    //冲泡 
    virtual void brew()
    {
        cout << "开始冲泡咖啡" << endl;
    }
    //倒入杯中
    virtual void inCup()
    {
        cout << "全部倒入杯中" << endl;
    }
    //加入辅料
    virtual void pour()
    {
        cout << "加入糖和牛奶" << endl;
        cout << "牛奶咖啡制作完成" << endl;
    }
};
//制作茶水
class Tea :public AbstractDrink
{
public:
    //煮水
    virtual void boiledWater()
    {
        cout << "先把水煮开" << endl;
    }
    //冲泡 
    virtual void brew()
    {
        cout << "开始冲泡茶叶" << endl;
    }
    //倒入杯中
    virtual void inCup()
    {
        cout << "全部倒入杯中" << endl;
    }
    //加入辅料
    virtual void pour()
    {
        cout << "加入枸杞" << endl;
        cout << "茶水制作完成" << endl;
    }
};
//制作函数
void DoWork(AbstractDrink* abs)//父类指针指向子类对象AbstractDrinking* abs = new Coffee;
{
    abs->makeDrink();
    delete abs;//手动释放
    //堆区的数据被销毁了但是指针的类型没变,可以多次利用
}
void test()
{
    DoWork(new Coffee);
    cout << "---------------------" << endl;
    DoWork(new Tea);
}
void main()
{
    test();
}

代码解释

这个案例就是直接给一个类中加四个纯虚函数,然后再加一个makeDrink方法来调用全部函数。子类中需要重写四个纯虚函数,制作咖啡和茶的类步骤基本一样。在DoWork函数的形参列表,使用父类的指针,那么在test函数调用DoWork函数就可以直接new子类对象,这样也是父类指针指向子类对象,然后调用makeDrink方法后,用delete删除堆区父类指针,以免内存泄漏。

运行效果

案例三:电脑组装

案例要求

电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)

将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商

创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口

测试时组装三台不同的电脑进行工作

代码实现

class CPU
{
public:
    virtual void calculate() = 0;
};
class VideoCard
{
public:
    virtual void display() = 0;
};
class Storage
{
public:
    virtual void storage() = 0;
};
class Computer
{
public:
    Computer(CPU* cpu, VideoCard* vc, Storage* sto)
    {
        m_cpu = cpu;
        m_vc = vc;
        m_sto = sto;
    }
    //提供一个工作的函数
    void work()
    {
        m_cpu->calculate();
        m_vc->display();
        m_sto->storage();
    }
    //提供析构函数释放3个电脑零件
    ~Computer()
    {
        //释放CPU零件
        if (m_cpu != NULL)
        {
            delete m_cpu;
            m_cpu = NULL;
        }
        //释放显卡零件
        if (m_vc != NULL)
        {
            delete m_vc;
            m_vc = NULL;
        }
        //释放内存条零件指针
        if (m_sto != NULL)
        {
            delete m_sto;
            m_sto = NULL;
        }
    }
private:
    CPU* m_cpu;//CPU零件指针
    VideoCard* m_vc;//显卡零件指针
    Storage* m_sto;//内存条零件指针
};
//Intel
class IntelCPU :public CPU
{
public:
    virtual     void calculate()
    {
        cout << "Intel的CPU开始计算了" << endl;
    }
};
class IntelVideoCard :public VideoCard
{
public:
    virtual     void display()
    {
        cout << "Intel的显卡开始显示了" << endl;
    }
};
class IntelMemory :public Storage
{
public:
    virtual     void storage()
    {
        cout << "Intel的内存条开始存储了" << endl;
    }
};
//Lenovo
class LenovoCPU :public CPU
{
public:
    virtual     void calculate()
    {
        cout << "Lenovo的CPU开始计算了" << endl;
    }
};
class LenovoVideoCard :public VideoCard
{
public:
    virtual     void display()
    {
        cout << "Lenovo的显卡开始显示了" << endl;
    }
};
class LenovoMemory :public Storage
{
public:
    virtual     void storage()
    {
        cout << "Lenovo的内存条开始存储了" << endl;
    }
};
//组装电脑
void test01()
{
    //创建第一台电脑
    Computer* c1 = new Computer(new IntelCPU,new IntelVideoCard, new IntelMemory);
    c1->work();
    delete c1;
    cout << "***********************" << endl;
    //组装第二台电脑
    Computer* c2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);
    c2->work();
    delete c2;
    cout << "***********************" << endl;
    //组装第三台电脑
    Computer* c3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory);
    c3->work();
    delete c3;
}
void main()
{
    test01();
    system("pause");
}

代码解释

首先把CPU,显卡,内存条做成基类并各自添加纯虚函数,强制派生类进行重写。

然后创建Computer类,封装三个零件类的指针,在电脑类的有参构造中传入三个零件的指针并赋值,提供work函数调用各个零件的功能函数。在程序结束之前编译器会自动调用析构,所以我提供一个电脑类的析构函数,释放掉三个零件的指针。

接下来提供两个品牌,有Intel和Lenovo两个品牌的三种零件。对每个品牌的三个零件类进行继承并重写功能函数,提示具体品牌的零件做了什么具体的功能。

最后创建三个电脑,将零件进行组装,可以全部都是Intel也可以都是Lenovo也可以混合着组装。利用new开辟电脑类,直接使用有参构造,将new出来的零件类传给对应的父类指针,完成多态的使用。电脑类创建完毕后调用work函数使电脑运行,随后就将堆区指针删除,防止内存泄露。

运行效果

以上就是C++多态的示例详解的详细内容,更多关于C++多态的资料请关注编程网其它相关文章!

--结束END--

本文标题: C++多态的示例详解

本文链接: https://lsjlt.com/news/152885.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++多态的示例详解
    目录案例一:计算器案例要求代码实现运行效果案例二:制作饮品案例要求代码实现运行效果案例三:电脑组装案例要求代码实现运行效果今天就以三个案例来把C++多态的内容结束。第一个案例就是用多...
    99+
    2024-04-02
  • C#多态详解
    目录1.定义2.实现多态的两个因素3.案例4、使用多态的好处5、string类1、值类型2、引用类型6.运算符重载:总结1.定义 多态是同一个行为具有多个不同表现形式或形态的能力。 ...
    99+
    2024-04-02
  • C++中多态的示例分析
    小编给大家分享一下C++中多态的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 多态概念1.1 概念多态的概念:通俗来说,就是多种形态,具体点就是去完...
    99+
    2023-06-15
  • C#多线程Thread使用示例详解
    本文实例为大家分享了C#多线程Thread使用的示例代码,供大家参考,具体内容如下 多线程: 线程生命周期状态图: C#线程优先级(概率高低): 基本使用示例: usin...
    99+
    2024-04-02
  • c#中多线程间的同步示例详解
    目录一、引入二、Lock三、Monitor四、Interlocked五、Semaphore六、Event七、Barrier八、ReaderWriterLockSlim九、Mutex十...
    99+
    2024-04-02
  • C++中的多态详谈
    目录1. 多态概念1.1 概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 代码示例2.5 虚函数重写的两个例外2.6 C++11 overr...
    99+
    2024-04-02
  • Java动态代理的示例详解
    目录定义分类案例需求方案一:jdk动态代理方案二:cglib动态代理分析总结定义 动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通过代理类来调用目标对象的方法,是在...
    99+
    2024-04-02
  • 详解C++中多态的底层原理
    目录前言1.虚函数表(1)虚函数表指针(2)虚函数表2.虚函数表的继承–重写(覆盖)的原理3.观察虚表的方法(1)内存观察(2)打印虚表(3)虚表的位置4.多态的底层过程...
    99+
    2024-04-02
  • 超级详细讲解C++中的多态
    目录多态概念引入1、C++中多态的实现1.1 多态的构成条件1.2 虚函数1.3虚函数的重写1.4 C++11 override && final1.5 重载,覆盖(...
    99+
    2024-04-02
  • C++学习之多态的使用详解
    目录前言多态向上转型向下转型作用域前言 最近为了完成数据库系统的实验,又复习起了《C++ Primer》,上一次看这本巨著也是大二下的六月份,那时看面向对象程序编程这一章还云里雾里的...
    99+
    2024-04-02
  • c#使用多线程的几种方式示例详解
    C#中使用多线程的几种方式有以下几种:1. 使用Thread类:Thread类是C#中最基本的多线程类,可以使用它创建和控制线程。下面是一个使用Thread类创建并启动线程的示例:```csharpusing System;using ...
    99+
    2023-08-09
    C#
  • C++类和对象之多态详解
    目录多态基本概念和原理剖析多态案例1 计算器类纯虚函数和抽象类多态案例2 制作饮品虚析构和纯虚析构多态案例3 电脑组装多态基本概念和原理剖析 多态:多态是C++面向对象的三大特性之一...
    99+
    2024-04-02
  • C++中多态的定义及实现详解
    目录1.多态概念1.1概念2.多态的定义及实现2.1多态的构成条件2.2虚函数2.3虚函数的重写2.4代码示例2.4.1没构成重写2.4.2构成重写2.5虚函数重写的两个例外&nbs...
    99+
    2024-04-02
  • C++ LeetCode542矩阵示例详解
    目录LeetCode  542.01 矩阵方法一:广度优先搜索AC代码C++LeetCode  542.01 矩阵 力扣题目链接:leetcode.cn/pro...
    99+
    2022-12-16
    C++ LeetCode矩阵 C++ LeetCode题解
  • C++语义copyandswap示例详解
    目录class对象的初始化constructor 构造器constructor overload 构造器重载copy constructor 拷贝构造器拷贝构造器的调用时机自定义拷贝...
    99+
    2022-11-13
    C++语义copy and swap C++语义
  • C++BoostBimap示例详细讲解
    目录一、提要二、示例练习一、提要 库 Boost.Bimap 基于 Boost.MultiIndex 并提供了一个无需先定义即可立即使用的容器。该容器类似于 std::map,但支持...
    99+
    2022-11-13
    C++ Boost Bimap C++ Bimap库
  • C++:多态讲解
    多态 1.多态的概念2.多态的定义和实现2.1多态构成条件2.2虚函数2.3虚函数的重写(覆盖)2.4 C++11 override 和 final2.5重载、重写(覆盖)、隐藏(重定义)的对...
    99+
    2023-10-19
    c++ 开发语言 学习方法 笔记 经验分享
  • C#中的composite模式示例详解
    目录写在前面一个简单例子基层员工类经理类公司架构类客户端代码再想一下使用组合模式进行重构透明型安全型重构后的代码(透明型)写在前面 Composite组合模式属于设计模式中比较热门的...
    99+
    2024-04-02
  • 关于C#中的Invoke示例详解
    目录C# 关于Invoke什么时候用?为什么要用1、Control的Invoke2、Delegate的Invoke怎么用?1、Control 的 Invoke2、Delegate的I...
    99+
    2023-02-06
    c#的invoke c#中invoke方法详解 c# Invoke
  • C++实现AVL树的示例详解
    目录AVL 树的概念AVL 树的实现节点的定义接口总览插入旋转AVL 树的概念 也许因为插入的值不够随机,也许因为经过某些插入或删除操作,二叉搜索树可能会失去平衡,甚至可能退化为单链...
    99+
    2023-03-03
    C++实现AVL树 C++ AVL树
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作