c++中虚函数、纯虚函数以及虚函数的实现原理

c++中虚函数、纯虚函数以及虚函数的实现原理

什么是虚函数和纯虚函数

虚函数(Virtual Functions)和纯虚函数(Pure Virtual Functions)是 C++ 中用于实现多态性的重要概念。

虚函数(Virtual Functions)

虚函数是在基类中声明为虚函数的成员函数。它允许在派生类中进行重写(覆盖),并且在运行时根据对象的实际类型调用适当的函数。虚函数通过使用 virtual 关键字进行声明,派生类可以选择性地重写基类中的虚函数。

示例:
#include <iostream>class Base {
public:virtual void show() {std::cout << "Base::show()" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived::show()" << std::endl;}
};int main() {Base* basePtr = new Derived();basePtr->show(); // 输出 Derived::show()delete basePtr;return 0;
}

在这个例子中,Base 类中的 show() 函数被声明为虚函数,在 Derived 类中对其进行了重写。当使用基类指针指向派生类对象时,调用 show() 函数时会根据对象的实际类型来调用适当的函数。

纯虚函数(Pure Virtual Functions)

纯虚函数是在基类中声明为纯虚函数的虚函数,它没有具体的实现,而是用 = 0 来指示编译器该函数没有实现。含有纯虚函数的类被称为抽象类,不能直接实例化,只能作为基类来派生其他类。

示例:
#include <iostream>class Shape {
public:// 纯虚函数virtual void draw() = 0;
};class Circle : public Shape {
public:// 实现了纯虚函数void draw() override {std::cout << "Drawing a circle." << std::endl;}
};int main() {// Shape shape; // 错误!抽象类不能被实例化Circle circle;circle.draw(); // 输出 Drawing a circle.return 0;
}

在这个例子中,Shape 类中的 draw() 函数被声明为纯虚函数,因此 Shape 类成为了一个抽象类。Circle 类继承自 Shape 类,并且实现了 draw() 函数,因此 Circle 类可以被实例化。

虚函数的实现原理

在 C++ 中,虚函数的实现原理涉及到两个关键概念:虚函数表(vtable)和虚函数指针(vptr)。

1. 虚函数表(vtable)

虚函数表是一张存储了类中虚函数地址的表格,每个包含虚函数的类都会有一个对应的虚函数表。虚函数表中的每个条目存储了一个虚函数的地址,通常是类中声明的虚函数的地址。

当类中至少有一个虚函数时,编译器会为该类生成一个虚函数表。每个类只有一个虚函数表,存储在内存的一个固定位置。子类的虚函数表会包含其继承的父类的虚函数表,以及自己新增的虚函数。

2. 虚函数指针(vptr)

虚函数指针是一个指向虚函数表的指针,它存储在类的对象中。每个类的对象都有一个对应的虚函数指针,指向该类的虚函数表。

当调用一个虚函数时,编译器会使用对象中的虚函数指针找到对应的虚函数表,然后在虚函数表中查找相应的虚函数地址,并调用该函数。

示例

#include <iostream>class Base {
public:virtual void show() {std::cout << "Base::show()" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived::show()" << std::endl;}
};int main() {Base* basePtr = new Derived();basePtr->show(); // Derived::show()delete basePtr;return 0;
}

在这个例子中,Base 类有一个虚函数 show()Derived 类继承自 Base 类并重写了 show() 函数。当创建 Derived 类的对象并将其赋值给 Base 类的指针时,实际上是将 basePtr 指向了 Derived 类的对象。当调用 basePtr->show() 时,虚函数机制会使用 basePtr 中存储的虚函数指针找到 Derived 类的虚函数表,然后调用 Derived 类中的 show() 函数。

虚函数机制通过虚函数表和虚函数指针实现了运行时多态性,允许在运行时根据对象的实际类型来调用适当的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法课程笔记——常用库函数

memset初始化 设置成0是可以每个设置为0 而1时会特别大 -1的补码是11111111 要先排序 unique得到的是地址 地址减去得到下标 结果会放到后面 如果这样非相邻 会出错 要先用sort排序 O&#xff08;n&#xff09;被O&#xff08;nlogn&#xff09;覆盖

服务器数据恢复—xfs文件系统节点、目录项丢失的数据恢复案例

服务器数据恢复环境&#xff1a; EMC某型号存储&#xff0c;该存储内有一组由12块磁盘组建的raid5阵列&#xff0c;划分了两个lun。 服务器故障&#xff1a; 管理员为服务器重装操作系统后&#xff0c;发现服务器的磁盘分区发生改变&#xff0c;原来的sdc3分区丢失。由于该分区…

葡萄书--深度学习基础

卷积神经网络 卷积神经网络具有的特性&#xff1a; 平移不变性&#xff08;translation invariance&#xff09;&#xff1a;不管检测对象出现在图像中的哪个位置&#xff0c;神经网络的前面几层应该对相同的图像区域具有相似的反应&#xff0c;即为“平移不变性”。图像的平移…

web自动化系列-selenium 的鼠标操作(十)

对于鼠标操作 &#xff0c;我们可以通过click()方法进行点击操作 &#xff0c;但是有些特殊场景下的操作 &#xff0c;click()是无法完成的 &#xff0c;比如 &#xff1a;我想进行鼠标悬停 、想进行鼠标拖拽 &#xff0c;怎么办 &#xff1f; 这个时候你用click()是无法完成的…

渲染技术如何改变影视制作的面貌

随着科技的飞速发展&#xff0c;影视制作领域也迎来了翻天覆地的变化。其中&#xff0c;渲染技术的不断革新&#xff0c;更是对影视制作产生了深远的影响。渲染作为影视制作中的关键环节&#xff0c;渲染技术的提升&#xff0c;不仅提升了画面的质量&#xff0c;还为创作者提供…

计算机网络 Cisco远程Telnet访问交换机和Console终端连接交换机

一、实验要求和内容 1、配置交换机进入特权模式密文密码为“abcd两位班内学号”&#xff0c;远程登陆密码为“123456” 2、验证PC0通过远程登陆到交换机上&#xff0c;看是否可以进去特权模式 二、实验步骤 1、将一台还没配置的新交换机&#xff0c;利用console线连接设备的…

Github 2024-04-17 C开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目2Whisper.cpp: 高性能自动语音识别模型的C/C++移植 创建周期:569 天开发语言:C, C++协议类型:MIT LicenseStar数量:30141 个…

OpenCV基本图像处理操作(六)——直方图与模版匹配

直方图 cv2.calcHist(images,channels,mask,histSize,ranges) images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的…

在Visual Studio配置C++的netCDF库的方法

本文介绍在Windows电脑的Visual Studio软件中&#xff0c;配置C 语言最新版netCDF库的方法。 netCDF&#xff08;Network Common Data Form&#xff09;是一种用于存储、访问和共享科学数据的文件格式和库&#xff0c;其提供了一种灵活的方式来组织、描述和存储多维数据&#…

第二证券|存储芯片概念爆发,佰维存储“20cm”涨停,恒烁股份等大涨

存储芯片概念17日盘中强势拉升&#xff0c;截至发稿&#xff0c;佰维存储“20cm”涨停&#xff0c;商络电子、同有科技、恒烁股份、朗科科技等涨超10%&#xff0c;德明利、雅克科技等亦涨停。 值得注意的是&#xff0c;佰维存储强势涨停&#xff0c;公司昨日晚间披露的成绩预告…

基于java+springboot+vue实现的健身俱乐部系统(文末源码+Lw+ppt)23-49

摘 要 随着社会的发展&#xff0c;健身俱乐部的管理形势越来越严峻。越来越多的用户利用互联网获得信息&#xff0c;健身信息鱼龙混杂&#xff0c;信息真假难以辨别。为了方便用户更好的获得本健身俱乐部管理信息&#xff0c;因此&#xff0c;设计一种安全高效的健身俱乐部网…

Kafka 架构深入探索

目录 一、Kafka 工作流程及文件存储机制 二、数据可靠性保证 三 、数据一致性问题 3.1follower 故障 3.2leader 故障 四、ack 应答机制 五、部署FilebeatKafkaELK 5.1环境准备 5.2部署ELK 5.2.1部署 Elasticsearch 软件 5.2.1.1修改elasticsearch主配置文件 5.2…

Midjourney 实现角色一致性的新方法

AI 绘画的奇妙之处&#xff0c;实乃令人叹为观止&#xff01;就像大千世界中&#xff0c;寻不见两片完全相同的树叶一般&#xff0c;AI 绘画亦复如是。同一提示之词&#xff0c;竟能催生出千变万化的图像&#xff0c;使得AI所绘之作&#xff0c;宛如自然之物般独特&#xff0c;…

项目7-音乐播放器2(上传音乐+查询音乐+拦截器)

0.加入拦截器 之后就不用对用户是否登录进行判断了 0.1 定义拦截器 0.2 注册拦截器 生效 1.上传音乐的接口设计 请求&#xff1a; { post, /music/upload {singer&#xff0c;MultipartFile file}&#xff0c; } 响应&#xff1a; { "status": 0, "message&…

单链表经典算法题分析

目录 一、链表的中间节点 1.1 题目 1.2 题解 1.3 收获 二、移除链表元素 2.1 题目 2.2 题解 2.3 收获 2.4递归详解 三、反转链表 3.1 题目 3.2 题解 3.3 解释 四、合并两个有序列表 4.1 题目 4.2 题解 4.3 递归详解 声明&#xff1a;本文所有题目均摘自leetco…

《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

1.简介 页面对象模型&#xff08;Page Object Model&#xff09;在Selenium Webdriver自动化测试中使用非常流行和受欢迎&#xff0c;作为自动化测试工程师应该至少听说过POM这个概念。本篇介绍POM的简介&#xff0c;接下来宏哥一步一步告诉你如何在你JavaSelenium3自动化测试…

13个Java基础面试题

Hi&#xff0c;大家好&#xff0c;我是王二蛋。 金三银四求职季&#xff0c;特地为大家整理出13个 Java 基础面试题&#xff0c;希望能为正在准备或即将参与面试的小伙伴们提供些许帮助。 后续还会整理关于线程、IO、JUC等Java相关面试题&#xff0c;敬请各位持续关注。 这1…

【ROS2】搭建ROS2-Humble + Vscode开发流程

【ROS2】搭建ROS2-Humble Vscode开发流程 文章目录 【ROS2】搭建ROS2-Humble Vscode开发流程1.基本环境配置2.搭建Vscode开发环境 1.基本环境配置 基本的环境配置包括以下步骤&#xff1a; 安装ROS2-Humble&#xff0c;可以参考这里安装一些基本的工具&#xff0c;可以参考…

nuxt3项目使用swiper11插件实现点击‘’返回顶部按钮‘’返回到第一屏

该案例主要实现点击返回顶部按钮返回至swiper第一个slide。 版本&#xff1a; "nuxt": "^3.10.3", "pinia": "^2.1.7", "swiper": "^11.0.7", 官方说明 swiper.slideTo(index, speed, runCallbacks) Run transit…

浅析MySQL 8忘记密码处理方式

对MySQL有研究的读者&#xff0c;可能会发现MySQL更新很快&#xff0c;在安装方式上&#xff0c;MySQL提供了两种经典安装方式&#xff1a;解压式和一键式&#xff0c;虽然是两种安装方式&#xff0c;但我更提倡选择解压式安装&#xff0c;不仅快&#xff0c;还干净。在操作系统…