【C++ 多态】(一)虚函数重写✍

embedded/2024/9/22 23:30:25/

文章目录

      • 1.虚函数重写的三个例外
        • 1.1协变(基类与派生类虚函数返回值类型不同)
        • 1.2析构函数的重写(基类与派生类析构函数的名字不同)
        • 1.3派生类可以不写 virtual
      • 2.面试题✍

1.虚函数重写的三个例外

1.1协变(基类与派生类虚函数返回值类型不同)

①🍎协变的概念:

派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。

在这里插入图片描述

1.2析构函数的重写(基类与派生类析构函数的名字不同)

①🍎注意:如果派生类 new 出来了一个对象,申请了一段内存,必须重写子类的析构函数,并将基类的析构函数定义成为虚函数,不然子类申请的空间无法释放掉(内存泄露)。

子类的对象模型一部分是自己的,一部分是从父类继承的!所以析构的时候,“先子后父”(先把自己的释放再释放从父类继承的)❗

②🍎虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor

	 Person* p1 = new Person;Person* p2 = new Student;p1->destructor + operator delete(p1)p2->destructor + operator delete(p2)多态问题❗:p1 和 p2 是什么类型,析构就调用什么类型(所以如果基类的析构函数不是虚函数的话,无法正确释放掉子类申请的空间,造成内存泄露)期望:指向父类调用父类析构期望:指向子类调用子类析构结论:建议析构函数定义为虚函数,防止发生内存泄漏

在这里插入图片描述
在这里插入图片描述

1.3派生类可以不写 virtual

①🍎重写只需要重写派生类的实现方式就好了(意思就是子类的函数名、函数参数、返回值类型用的是父类的),只重写函数体内部的实现!子类已经在语法上面继承下来了,所以重写实现就可以了。

2.面试题✍

做这道题目之前首先要弄清楚下面几个问题👇
①🍎两个 func() 构成虚函数重写吗?

构成虚函数的重写,子类的 virtual 将其省掉了。

②🍎test() 函数内部的 this 指针是指向 A* 还是 B*?
B*p = new B;p指向的是派生类,先在子类中查找有没有 test()函数,没有的话 ,就去父类查找,如果父类也没有的话,就会报错,所以派生类不是拷贝下来。

③🍎 虚函数重写,重写的是函数体的实现,函数体的结构部分(如函数名,函数参数,函数返回值)用的是父类的。

答案:B
在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/embedded/9100.html

相关文章

前台向后台传递参数时,HTML标签<p>、<span>丢失已经报错等问题解决方案

在保存文档时&#xff0c;前台向后台传递参数时&#xff0c;特殊字符&#xff08;、-&#xff09;标签<p>、<span> 丢失的问题,原因是由于系统后台的xss或者其他拦截器针对脚本语言进行过滤导致的,针对这种情况可以通过使用hex编码绕过 1.前端页面对传输的数据进行…

redis常用5大数据类型

1、string&#xff08;字符串&#xff09; String是Redis中最常用的一种数据类型&#xff0c;也是Redis中最简单的一种数据类型。首先&#xff0c;表面上它是字符串&#xff0c;但其实他可以灵活的表示字符串、整数、浮点数3种值。Redis会自动的识别这3种值。 2、list(列表) …

websocket 连接,http 协议下用 ws, https 协议下必须要使用 wss

解决方案&#xff1a; https 相当于使用 httpssl 认证&#xff0c;使用 https 时 websocket 访问&#xff08;比如建立链接时&#xff09;必须要使用 wss。 详细解释&#xff1a; WebSocket 协议有两个主要版本&#xff1a;“ws”和“wss”。"ws"表示非加密的 Web…

react经验12:等待状态更新

应用场景: 等待react组件内的state发生变更后进行后续操作。 已知问题 通常state的变化会引起dom的刷新&#xff0c;更新state一般使用setState&#xff0c;但这是个异步操作。 如果此时需要立即操作dom&#xff0c;得到的目标dom是刷新之前的样子。 应对方法 方法1:使用u…

登录的几种方式

一、session 1、客户端发送请求&#xff0c;服务器将登录信息存储在 Session 中&#xff0c;Session 依赖于 Cookie&#xff08;cookie指的就是在浏览器里面存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。Cookie实际上是一小段的文本信息。&#xff09;&…

MySQL学习笔记1(MySQL基础)

1.MySQL基础 1.数据库相关概念 ​ *数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储 DtaBase(DB) ​ *数据管理系统&#xff1a;操纵和管理数据库的大型软件 DataBase Management System (DBMS) ​ *SQL&#xff1a;操作关系型数据库的编程语言&#…

Linux-延迟任务and定时任务

一.在系统中设定延迟任务要求如下 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户可以执行延迟任务的设定 二.在…

Debezium分享系列之:部署Debezium采集Oracle数据库的详细步骤

Debezium分享系列之:部署Debezium采集Oracle数据库的详细步骤 一、部署Debezium Oracle连接器二、Debezium Oracle 连接器配置三、添加连接器配置四、可插拔数据库与不可插拔数据库一、部署Debezium Oracle连接器 部署的详细步骤可以参考博主这篇技术文章: Debezium系列之:…