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分区丢失。由于该分区…

photoshop基础学习笔记

学习 Photoshop 的基础知识是掌握图像处理和设计的关键。以下是一份基础学习笔记&#xff0c;帮助你开始学习 Photoshop&#xff1a; 1. Photoshop 界面导览 工具栏&#xff08;Tool Bar&#xff09;&#xff1a;包含了各种工具&#xff0c;如选择工具、画笔工具、橡皮擦工具…

Linux命令学习—DHCP 服务器

1.1、DHCP 服务器 ①、DHCP&#xff08;dynamic host configure protocol&#xff09;动态主机配置协议 最大的功能就是向客户端提供 TCP/IP 信息&#xff0c;使用的是 UDP:67 端口 ②、手动设定适合&#xff1a;适用小型网络 ③、手动输入 IP 地址和自动获取比较优缺点 ④…

攻防演练,作为红方的步骤应该是那些

在执行合法的攻防演练中&#xff0c;对目标服务器如 http://XXXXX/ 进行漏洞扫描和评估需要遵循严格的步骤来确保所有活动都是安全、合法且有效的。以下是一些基本步骤和技术指南&#xff0c;以及使用 nmap 进行初始扫描的示例。 1. 获取授权 确保你有明确的书面授权来进行漏…

问,由于java存在性能上,以及部分功能上的缺点,请问如何正确使用C,C++,Go,这三个语言,提升Java Web项目的性能?

拓展阅读&#xff1a;版本任你发&#xff0c;我用java8 我明白Java虽然在许多方面表现出色&#xff0c;但在某些特定场景下可能会遇到性能瓶颈或功能限制。为了提升Java Web项目的性能&#xff0c;可以考虑将C、C和Go这三种语言用于特定的组件或服务。以下是如何正确使用这些语…

葡萄书--深度学习基础

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

设置Linux命令行tab补全不区分大小写

root权限编辑文件 sudo vim /etc/inputrc加入新配置 [按下i键开始输入] 文件末尾加入新配置 set completion-ignore-case on保存 [按下esc键&#xff0c;再输入:wq确定保存] 重启 reboot

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 个…

Spark大数据常见错误及解决方案-HDFS-费元星

为什么一直鼓励大家做好错误记录&#xff0c;因为人脑的遗忘性是固定的&#xff0c;知识密集型的点&#xff0c;随着时间流逝&#xff0c;都会逐步遗忘掉。 另外鼓励大家对每个知识点都先去源码里搜一下。有几个点非常重要&#xff1a; 1.源码中的错误提示是非常系统的&#x…

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…

pytorch实现自己的深度神经网络(公共数据集)

一、训练文件——train.py 注意&#xff1a;在运行此代码之前&#xff0c;需要配置好pytorch-GPU版本的环境&#xff0c;具体再次不谈。 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms# 检…

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

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