当前位置: 首页 > news >正文

【C++】面向对象编程(六)在派生类中定义一个虚函数、虚函数的静态解析

在派生类中定义一个虚函数

  • 定义派生类时:
  1. 将基类中的虚函数覆盖掉:派生类提供新定义,所声明的函数原型必须完全符合基类所声明的函数原型(包括:参数列表、返回类型、常量性);
  2. 原封不动继承基类中的虚函数;如果继承的是纯虚函数,则这个派生类也会被视为抽象类,无法为它定义任何对象。
  • 在派生类中,如果其基类的同名成员函数已声明为虚函数,则派生类的同名成员函数声明和定义前不用加virtual,即为了覆盖基类的某个虚函数,而进行函数声明时,不一定得加上关键字virtual,编译器会自动根据两个同名函数的原型声明,决定某个函数是否会覆盖其基类中的同名函数。
class num_sequence{
public:virtual const char*what_am_i()const{return "num_sequence\n";}
//...
};
class Fibonacci : public num_sequence{
public:virtual const char* what_am_i(){return "Fibonacci\n";}//编译器报错:基类声明为const,派生类却是non-const//...
};
  • 返回类型必须完全吻合“的一个例外——当基类的虚函数返回某个基类形式(通常是指针或者引用)时,派生类中的同名函数便可以返回该基类所派生出来的类型:
class num_sequence{
public://我们想让派生类的clone()函数可返回一个指针,//指向基类num_sequence的任何一个派生类virtual num_sequence *clone() = 0;//...
};class Fibonacci : public num_seuqence{
public://派生类同名函数不用加virtualFibonacci *clone(){return new Fibonacci(*this);}
//...
};

虚函数的静态解析

为了能够在“单一对象中展现多种类型”,多态需要一层间接性。在C++中,唯有用基类的指针和引用才能够支持面向对象编程概念

虚函数机制无用的两种情况:

  1. 基类的构造函数和析构函数里
  2. 使用的是基类的对象,而非基类对象的指针或引用

所以,在基类的构造函数中,派生类的虚函数绝对不会被调用;基类的析构函数同理。


示例分析:

  • 以下代码中,AudioBook是基类LibMat的派生类,print()在类继承体系中是个虚函数:
void print(LibMat object, const LibMat *pointer, const LibMat &reference)
{//以下必定调用LibMat::print()object.print();//以下一定会通过虚函数机制来解析,//我们无法预知哪一份print()会被调用pointer->print();reference.print();
}
  • 当我们为基类声明一个实际对象(如print()的第一个参数),同时也就分配出了足以容纳该实际对象的内存空间;
  • 如果稍后传入的是个派生类对象,那就没有足够的内存放置派生类中的各个数据成员,例如我们将AudioBook对象传给print()
int main()
{AudioBook iWish("Her pride of 10", "Stanley Lippman", "Jeremy Irons");print(iWish, iWish, iWish);//...
}
  • 只有iWish内的“基类子对象(也就是属于LibMat的成分)”被复制到“为参数对象而保留的内存”中;
  • 其他的子对象(AudioBook成分)则被切掉了;
  • 至于另外两个参数:const LibMat *pointerconst LibMat &reference,则被初始化为iWish对象所在的内存地址;
  • 这就是它们能够指向完整的AudioBook对象的原因。

相关文章:

【C++】面向对象编程(六)在派生类中定义一个虚函数、虚函数的静态解析

在派生类中定义一个虚函数 定义派生类时: 将基类中的虚函数覆盖掉:派生类提供新定义,所声明的函数原型必须完全符合基类所声明的函数原型(包括:参数列表、返回类型、常量性);原封不动继承基类…...

uniapp vue3 静态图片引入

方法一 从新定义路径 一定看好你图片的路径 代码 <template><div class"main">Main<img :src"getImg()" alt""></div> </template><!-- 方式一 // <script setup> // let imgName logo.png // cons…...

仅用61行代码,你也能从零训练大模型

本文并非基于微调训练模型&#xff0c;而是从头开始训练出一个全新的大语言模型的硬核教程。看完本篇&#xff0c;你将了解训练出一个大模型的环境准备、数据准备&#xff0c;生成分词&#xff0c;模型训练、测试模型等环节分别需要做什么。AI 小白友好~文中代码可以直接实操运…...

Vue3目录结构与Yarn.lock 的版本锁定

Vue目录结构与Yarn.lock 的版本锁定 一、Vue3.0目录结构图总览 举个例子看vue的目录&#xff0c;一开始不知道该目录是什么意思目录里各个文件包里安放有什么&#xff0c;程序员在哪里操作该如何操作。 下图目录看Vue新项目 VS Code 打开文件包后出现一列目录 二、目录结构 1…...

内网渗透之哈希传递

文章目录 哈希传递&#xff08;NTLM哈希&#xff09;概念LMNTLM 原理利用hash传递获取域控RDP 总结 哈希传递&#xff08;NTLM哈希&#xff09; 内网渗透中找到域控IP后使用什么攻击手法拿下域控&#xff1a; 扫描域控开放端口。因为域控会开放远程连接&#xff1a;windows开…...

Haar cascade+opencv检测算法

Harr特征识别人脸 Haar cascade opencv步骤 读取包含人脸的图片使用haar模型识别人脸将识别的结果用矩形框画出来 构造haar检测器 &#xff1a;cv2.CascadeClassifier(具体检测模型文件) # 构造Haar检测器 # 级联分级机,cv2.CascadeClassifier():cv2的内置方法&#xff0…...

跨域请求方案整理实践

项目场景&#xff1a; 调用接口进行手机验证提示,项目需要调用其它域名的接口,导致前端提示跨域问题 问题描述 前端调用其他域名接口时报错提示: index.html#/StatisticalAnalysisOfVacancy:1 Access to XMLHttpRequest at http://xxxxx/CustomerService/template/examineMes…...

Git Pull failure 【add/commit】

操作页面 操作步骤 1. 打开项目所在 在.git目录下右击打开Git Bssh Here 2. git add . 3. git commit -m "提交" 4. 成功提交到本地, 这下就可以拉取代码了...

单链表习题(对应章节chapter2)

题目1&#xff1a;链表的中间结点 题目来源&#xff1a;leetcode链表的中间结点 第一种思路分析&#xff1a;考虑指针移动到相应的位置来做 参考代码&#xff1a;位置&#xff08;/chapter2/c/middle-link-list-node/lc1.cc&#xff09; #include <stdio.h> extern &qu…...

SQL创建新表

表的创建、修改与删除&#xff1a; 1.1 直接创建表&#xff1a;CREATE TABLE [IF NOT EXISTS] tb_name – 不存在才创建&#xff0c;存在就跳过 (column_name1 data_type1 – 列名和类型必选 [ PRIMARY KEY – 可选的约束&#xff0c;主键 | FOREIGN KEY – 外键&#xff0c;引…...

Python视频剪辑-Moviepy视频尺寸和颜色调整技巧

在视频编辑中,尺寸和颜色是两个不能忽视的重要因素。本文将从专业角度深入探讨如何通过MoviePy进行视频尺寸和颜色的调整,以及遮罩透明度的应用。 文章目录 视频尺寸变换函数裁剪视频指定区域裁剪视频像素为偶数视频增加边框缩小、放大视频视频颜色变换函数blackwhite 视频变…...

前端笔记:Create React App 初始化项目的几个关键文件解读

1 介绍 Create React App 是一个官方支持的方式&#xff0c;用于创建单页应用的 React 设置用于构建用户界面的 JAVASCRIPT 库主要用于构建 UI 2 项目结构 一个典型的 Create React App 项目结构如下&#xff1a; ├── package.json ├── public # 这…...

提高工作效率!本地部署Stackedit Markdown编辑器,并实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…...

visual studio解决bug封装dll库

1.速度最大化 O2 2.设置输出目录 配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 3.输出X86 X64分别对应的dll、lib、pdb 然后修改更新说明 更新说明格式如下&#xff1a; 4.将库提交到FTP每日更新库文档下 和测试交接…...

合肥工业大学自然语言处理实验报告

工程报告 目录 1 研究背景 4 2 工程目标 7 2.1 工程一 7 2.2 工程二 7 2.3 工程三 7 2.4 工程四 7 3 实验环境与工具 7 4 模型方法 8 4.1 n-gram模型 8 4.2 模型的平滑 9 4.2.1 Add-one 9 4.2.2 Add-k 9 4.2.3 Backoff 10 4.2.4 Interpolation 10 4.2.5 Absolute discounting 1…...

layui laydate实现日期选择并禁用指定的时间

最终实现禁用2023-9-26这天的效果 官网地址 日期和时间组件文档 - layui.laydate 下面是实现的代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>layDate快速使用</title><link rel"stylesheet"…...

scala数组函数合集

目录 1. 添加类函数 2.生成类函数 3.删除类函数 4.查找类函数 5.统计类函数 6.修改类函数 7.判断类函数 8.获取集合元素 9.集合操作类函数 10.转换类函数 11.工具类函数 12.集合内与集合间计算函数 在 scala 中Array数组是一种可变的、可索引的数据集合 创建数组…...

软件测试「转行」答疑(未完更新中)

软件测试行业「转行」答疑&#xff08;未完更新中&#xff09; ⭐文章简介一、2023年「互联网」行业现状&#xff01;二、0基础转行「互联网」的5句大实话建议&#xff01;三、互联网有哪些「职业」&#xff0c;可以选择&#xff1f;四、这些职业之间的优缺点介绍。 ⭐文章简介…...

计算机网络---TCP/UDP

TCP/UDP 1、TCP三次握手 四次挥手? TCP是一种面向连接的、可靠的字节流服务。在建立TCP连接时,需要进行三次握手,而在关闭TCP连接时,需要进行四次挥手。具体来说,TCP三次握手的过程如下: 客户端向服务端发送SYN报文,表示请求建立连接。服务端收到SYN报文后,向客户端发…...

Docker私有仓库打开2375端口(linux)

前言 在我们开发测试过程中&#xff0c;需要频繁的更新docker镜像&#xff0c;然而默认情况下&#xff0c;docker的2375端口是关闭的&#xff0c;下面介绍如何打开端口。 1、打开步骤 1.1、修改配置 登录docker所在服务器&#xff0c;修改docker.service文件 vi /usr/lib/sys…...

实战起步:用快马生成数据分析项目的python环境与示例代码脚手架

今天想和大家分享一个数据分析项目的快速启动方案。作为一个经常需要处理各种数据的人&#xff0c;我发现每次开始新项目时&#xff0c;重复搭建环境和初始化项目结构特别浪费时间。后来发现了InsCode(快马)平台&#xff0c;它帮我解决了这个问题。 项目初始化脚本 这个脚本会自…...

Go语言中的网络编程

Go语言中的网络编程 1. 网络编程的基本概念 网络编程是指编写在网络上进行通信的程序。在Go语言中&#xff0c;网络编程主要通过net包来实现&#xff0c;支持TCP、UDP、HTTP等多种协议。 2. TCP服务器 2.1 基本TCP服务器 package mainimport ("fmt""net" )…...

FadCam 安卓后台视频录制应用,支持屏幕关闭录制,多画质高帧率,隐私保护,适配个人安防与事件记录等正当用途

大家好&#xff0c;我是大飞哥。在个人安防、事件记录、现场取证等场景中&#xff0c;普通安卓录屏应用大多需要保持屏幕常亮&#xff0c;不仅容易暴露录制行为&#xff0c;还会快速消耗电量&#xff0c;无法满足隐蔽、长效录制的需求&#xff0c;而部分后台录制工具又存在隐私…...

3分钟上手PCL2-CE:打造专属Minecraft启动环境的完整指南

3分钟上手PCL2-CE&#xff1a;打造专属Minecraft启动环境的完整指南 PCL2-CE社区版是一款开源游戏配置工具&#xff0c;致力于为Minecraft玩家提供高效、灵活的游戏环境管理方案。通过智能化配置和模块化设计&#xff0c;让玩家告别繁琐设置&#xff0c;轻松掌控游戏入口&…...

全志Tiger-ISP调试工具安装与使用全攻略

1. 全志Tiger-ISP调试工具入门指南 第一次接触全志Tiger-ISP调试工具时&#xff0c;我也是一头雾水。这个工具主要用于图像信号处理器(ISP)的调试和优化&#xff0c;是开发智能摄像头、行车记录仪等视觉设备的必备利器。简单来说&#xff0c;它能让你像调色师一样精细调整图像的…...

Cursor + Claude 3.7:解锁高效编程新范式

1. 为什么开发者需要CursorClaude 3.7组合 最近在重构一个遗留的电商系统时&#xff0c;我遇到了所有程序员都头疼的问题&#xff1a;面对20万行混杂着jQuery和Vue的祖传代码&#xff0c;光是理清支付模块的业务逻辑就花了三天。直到同事推荐了CursorClaude 3.7这个组合&#x…...

3步解决ComfyUI-Florence2视觉语言模型加载失败:实战配置指南

3步解决ComfyUI-Florence2视觉语言模型加载失败&#xff1a;实战配置指南 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 当您在ComfyUI中部署Microsoft Florence2视觉语言模型…...

找不到msvcr120.dll解决方法:2026年有效的一键修复与手动安装步骤

正玩着游戏或做着设计图&#xff0c;屏幕突然弹出“找不到msvcr120.dll”的提示&#xff0c;相信很多Windows用户都遇到过这种令人抓狂的时刻。这个错误意味着你的电脑缺少了某个软件或游戏运行所必需的“零件”。别担心&#xff0c;这个零件就是Microsoft Visual C 2013运行库…...

Java互联网大厂求职面试实录:Spring Boot、微服务与全栈技术深度解析

Java互联网大厂求职面试实录&#xff1a;Spring Boot、微服务与全栈技术深度解析 面试场景介绍 本文以互联网大厂面试为背景&#xff0c;通过严肃的面试官与搞笑的水货程序员“谢飞机”的对话&#xff0c;深入探讨Java求职者面试中常见的技术问题。涵盖Java SE、Jakarta EE、Sp…...

Qwen3-14B中文古诗创作效果:格律合规、意象统一、风格仿写展示

Qwen3-14B中文古诗创作效果&#xff1a;格律合规、意象统一、风格仿写展示 1. 引言&#xff1a;当AI遇见古诗创作 古诗创作一直被视为人类独有的艺术表达形式&#xff0c;需要深厚的文化底蕴和语言功底。然而&#xff0c;随着大语言模型的发展&#xff0c;AI在古诗创作领域展…...