C++,类的多态

2023-11-16

一、多态的基本概念

        多态:父类的指针或引用,指向或初始化子类的对象,调用子类对父类重新的函数,进而展开子类的功能。

        函数重新的必要条件:

  1. 必须有继承关系
  2. 子类和父类有同名同类型的函数
  3. 父类中的该函数必须是虚函数

虚函数:

        在函数前加上virtual修饰,即为虚函数。

        虚函数满足继承,即父类中的某函数为虚函数,继承到子类中,子类中的该函数依然为虚函数,如果子类再被继承,其子类中的该函数仍旧是虚函数。

virtua 函数返回值类型 函数名(参数列表)
{
    函数体;
}

二、多态中函数重写的原理

        若类中存在虚函数,则类中就会有一个虚指针,虚指针满足继承。虚指针指向虚函数表,虚函数表中记录了虚函数,包括父类的虚函数,子类对父类重写的函数。

三、虚析构函数

        当父类实例化的指针指向子类时,若释放该指针,则仅仅释放该指针指向的子类从父类继承的内容,而子类中原先存在的空间并未得到释放,会造成内存泄漏。此时就需要通过虚析构函数来解决。        

虚析构函数定义格式:

virtual ~类名()
{
    
}

        当父类的析构函数为虚析构函数时,释放父类的指针,内存泄漏问题得以解决。 

#include <iostream>

using namespace std;

//封装 人 类
class Person
{
private:
    string name;
public:
    Person() {}

    //有参构造函数
    Person(string n):name(n){}

    virtual ~Person()  //虚析构函数  满足继承
    {
        cout << "Person::析构函数"  << endl;
    }
};

//封装 学生  继承于人
class Stu:public Person
{
private:
    int id;
public:
    Stu(){}

    //有参构造
    Stu(string n , int i):Person(n),id(i){}
    ~Stu()
    {
        cout << "Stu::析构函数" << endl;
    }
};

int main()
{

    Person *p = new Stu("张三",1001);
    delete p;   //如果没有虚析构函数,进行释放p是,子类自己拓展的空间就没有释放--内存泄漏
    p = nullptr;
    return 0;
}

四、纯虚函数及抽象类

        当父类中的虚函数没有实际意义时,可将该虚函数设置为纯虚函数,含有纯虚函数的类被称为抽象类,抽象类不能实例化对象,当子类没有对父类的纯虚函数进行重新时,子类也被称为抽象类。

纯虚函数定义格式:

virtual 函数返回值类型 函数名(形参列表) = 0; //纯虚函数

示例:

#include <iostream>

using namespace std;

//..
class A  //抽象类
{
private:
    int a;
public:
    A() {}
    virtual void show() = 0;  //纯虚函数    
};


class B:public A
{
public:
    B() {}    
    void show()  //如果子类没有对父类的纯虚函数重写,那么子类也是抽象类,不能实例化一个对象
    {}
};


int main()
{
    B b;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++,类的多态 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 私有模板函数

    我有一堂课 C h class C private template
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • shiro实现基于redis的sessionDao

    shiro实现基于redis的sessionDao 将session持久化到数据库的一个关键步骤是对session对象的序列化和反序列化操作 另外在使用redis保存session时一定要设置过期时间 或在编码中检查过期并及时删除缓存 否则
  • 您的浏览器由所属组织管理_Windows 10 更新“某些设置由你的组织来管理”解决办法(2020.06.19)...

    1 造成原因 正常情况下不会对相关设置进行更改 绝大多数是杀毒软件或优化软件造成的 2 根本原因 本地组策略中 Windows 更新 的配置出现更改 3 策略位置 运行 gpedit msc 计算机配置 管理模板 Windows 组件 Wi
  • Sequential Recommendation with Graph Neural Networks

    Sequential Recommendation with Graph Neural Networks 文章目录 1 背景 2 模型 2 1 Interest Graph Construction 2 1 1 Raw graph cons
  • 【C语言】 看图说话-从源代码到exe

    1 从源代码到exe需要经过哪几个时期 答 要经过五个时期 分别为预处理期 编译期 汇编期 连接期和执行期 2 不同时期里 谁 在做什么事情 答 在预处理期 就是程序员在编写代码的过程 编译期中编译器将源代码变为汇编语言 汇编语言是计算机语
  • WebAPI项目搭建及其发布测试

    目录 1 创建项目 2 配置 3 发布 4 测试页面 1 创建项目 1 创建ASP NET Web应用程式 如下图 2 选择Empty 勾选Web API 点击确定创建 如下图 3 创建完成 如下图 4 添加文件夹及类 如下图 说明 BLL
  • python语句print(type([1、2、3、4))_Python语句 print(type([1,2,3,4])的运行结果是_学小易找答案...

    填空题 Python表达式eval 5 2 5 2 5 2 的结果是 填空题 循环语句 for i in range 3 21 4 的循环次数为 判断题 如有下面代码 输出的结果是一个元组 def f a b c print a b c f
  • 组件文件已损坏或android内部模块,android - Android Q更新后,模块化系统组件在托管配置文件中不可用 - 堆栈内存溢出...

    在从工作配置文件配置的设备设置应用中将操作系统从Android 9升级到10后 请停止运行 java lang RuntimeException Unable to start activity ComponentInfo com andr
  • Java中两个List之间的比较(差集,交集,并集)

    实现比较两个List之间的差异 包括获取两List的差集 交集 并集 不去重 去重 的API解法和优化解法的解决方案 求差集 差集 基于API解法 适用于小数据量 求List1中有的但是List2中没有的元素 时间复杂度 O list1 s
  • vs code 国内镜像源

    我们在去 vs code 官网下载软件时 会发现下载速度非常的慢 这是因为vs code官网本身在国外 离得比较远 自然下载速度快不起来了 如直接使用下面的链接 https az764295 vo msecnd net stable f80
  • python实现批量翻译——你不会还在一个个翻译吧

    python实现翻译 translate 语句 文本 google translate 语句 import pandas as pd from translate import Translator translator Translato
  • linux服务器成功卸载和安装anaconda(详细)

    卸载anaconda 只需要移除其文件夹即可 sudo rm rf path anaconda3 下载anaconda 在官网查找一下自己需要的anaconda版本 下载之后是一个 sh文件 并将其上传至服务器节点 也可以在清华源节点进行下
  • Linux基础笔记10

    find 常用示例 用来在指定目录下查找文件 任何位于参数之前的字符串都将被视为欲查找的目录名 如果使用该命令时 不设置任何参数 则 find 命令将在当前目录下查找子目录与文件 并且将查找到的子目录和文件全部进行显示 学习参考博文 骏马金
  • vue3实现H5监听浏览器回退并阻止回退

    当你的移动端页面有弹窗的组件并且这个组件不是来自于某些知名的组件库 你是否有这样的需求 当用户唤起弹窗之后又按下了手机自带的回退键 弹窗之前的页面也被关掉了 而用户本身的意愿是关掉弹窗而已 如果你也有这样的诉求 这篇文章帮你解决 1 给hi
  • 在不支持AirDrop的Mac上开启和使用AirDrop的方法

    本帖最后由 luciiferre 于 12 11 18 06 54 编辑 苹果为OS X 10 7 Lion系统加入了全新的AirDrop功能 该功能允许两台Mac之间无线传输文件 用户无需设置 只需要打开AirDrop文件夹即可查看到其他
  • 计算机网络之物理层

    目录 一 物理层概述 二 数据通信的基础知识 2 1数据通信系统的模型 2 2关于信道的几个基本概念 2 3信道的极限容量 三 物理层下面的传输媒体 3 1导引型传输媒体 3 2非导引型传输媒体 四 信道复用技术 五 数字传输系统 六 宽带
  • 华为OD机试真题 Java 实现【字符串加密】【2023Q1 100分】,附详细解题思路

    一 题目描述 有一种技巧可以对数据进行加密 它使用一个单词作为它的密匙 下面是它的工作原理 首先 选择一个单词作为密匙 如TRAILBLAZERS 如果单词中包含有重复的字母 只保留第1个 将所得结果作为新字母表开头 并将新建立的字母表中未
  • 闭环系统的零极点图判定稳定性_三步教你设计运放电路稳定性

    1 前言 集成运算放大器的参数有很多 但涉及到实际应用环境的不同 一些参数非常重要 另外一些则相对次要 例如 在交流高频领域 会重视带宽和压摆率 而在直流精密场合 则重视输入失调电压 输入偏置电流 还有一些参数 不管直流还是交流 都会重点关
  • 清华大学开源的chatGLM-6B部署实战

    Windows部署 win10 通过wsl部署 常见问题 torch cuda OutOfMemoryError CUDA out of memory 在Windows的系统环境变量中增加 变量名 PYTORCH CUDA ALLOC CO
  • 通过alter table A engine=innodb来重建表

    1 业务场景 即为什么要重建表 由于前期的存储设计不合理 表里有个字段 用于存储大段字符串 导致存储到磁盘的空间极大 严重影响表相关的增删改查速度 所有需要对表存储设计进行重构 并对表进行重建 2 实践记录 我们业务场景是由软删字段的 de
  • C++,类的多态

    一 多态的基本概念 多态 父类的指针或引用 指向或初始化子类的对象 调用子类对父类重新的函数 进而展开子类的功能 函数重新的必要条件 必须有继承关系 子类和父类有同名同类型的函数 父类中的该函数必须是虚函数 虚函数 在函数前加上virtua