虚函数应用和原理

虚函数的表现形式

用子类初始化父类指针, 调用虚函数时, 仍然调用的是子类的虚函数
测试代码如下

#include <iostream>
#include <string.h>using namespace std;class A
{
public:void test() { cout << 'a' << endl; };virtual void test2 (){ cout << 'a' << endl; };
};class B : public A
{
public:void test() { cout << 'b' << endl; };virtual void test2(){ cout << 'b' << endl; };
};int main()
{A* a = new B();a->test();a->test2();a->A::test2();
}

输出结果是

a
b
a

虚函数的实现方式

虚函数表

实现的核心是虚函数表, 每个包含虚函数的类都包含一个虚表, 并且如果该类被继承, 子类也会生成一个自己的虚表.

虚函数表指针

虚函数表是类的, 不是某个具体对象的, 同一个类的所有对象, 都使用同一张虚表, 那么, 对象类的虚表是如何绑定在一起的呢?
内部包含一个虚表指针__vptr, 指向虚函数表, 在编译阶段就已经生成. 所以当对象创建时, 便拥有了这个指向类的虚表的指针

关键问题

那么问题又来了, 用子类去初始化父类指针, 父类指针是指向父类部分, 为什么会调用子类的虚函数表呢?
C++中虚函数的作用是什么?它应该怎么用呢?
这篇文章里写的很好, 大概意思就是, 直接调用虚函数的时候, 其实调用的不是真正的虚函数, 而是一个叫CallVirtualFun的代码. 这段代码会用来获取真正虚函数地址, 最后调用虚函数.
个人认为这些CallVirtualFun里面的内容都是同样的逻辑, 找到实例真正的虚函数指针, 然后在表中找到和自己同名的函数指针, 并执行.

其他问题

我们把经过虚表调用虚函数的过程称为动态绑定,其表现出来的现象称为运行时多态。
动态绑定区别于传统的函数调用,传统的函数调用我们称之为静态绑定,即函数的调用在编译阶段就可以确定下来了。

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

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

相关文章

LeetCode-2589. 完成所有任务的最少时间【栈 贪心 数组 二分查找 排序】

LeetCode-2589. 完成所有任务的最少时间【栈 贪心 数组 二分查找 排序】 题目描述&#xff1a;解题思路一&#xff1a;贪心暴力解题思路二&#xff1a;栈二分查找解题思路三&#xff1a;简化版 题目描述&#xff1a; 你有一台电脑&#xff0c;它可以 同时 运行无数个任务。给你…

解锁电商数据之门:京东商品详情API接口的深度解析与应用指南

一、京东商品详情API简介 京东商品详情API是京东开放平台提供的一项服务&#xff0c;允许第三方应用通过调用接口获取京东商城中商品的详细信息。这些信息包括但不限于商品名称、价格、库存、详情描述、用户评价等。 二、功能特点 数据全面&#xff1a;提供商品的全方位数据…

mac安装两个版本谷歌浏览器;在mac运行不同版本的chrome浏览器

场景 正常情况下&#xff0c;mac上只能安装一个版本的chrome浏览器&#xff0c;即使你安装了两个版本的&#xff0c;打开老旧版本时候也会自动切换成最新版的浏览器 故本文主要解决如何下载和在mac运行不同版本的chrome浏览器 文章目录 场景一、下载1.mac本身就有一个最新版ch…

Java语言saas模式云HIS系统源码 前端Angular+后台SpringBoot云HIS系统源码 HIS系统适合哪些类型的医院?

Java语言saas模式云HIS系统源码 前端Angular后台SpringBoot云HIS系统源码 HIS系统适合哪些类型的医院&#xff1f; 云HIS系统&#xff08;医院信息系统&#xff09;是对医院及其所属各部门的人、财、物进行综合管理&#xff0c;对在医疗活动各阶段产生的数据进行采集、储存、处…

CCF20181201——小明上学

CCF20181201——小明上学 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int r,y,g,n,k[101],t[101],sum0;cin>>r>>y>>g;cin>>n; for(int i0;i<n;i){cin>>k[i]>>t[i];if(k[i]0||k[i]1)sumt[i];…

ITSM的服务台如何让工作更流畅

在现代企业的信息技术管理框架内&#xff0c;IT服务管理&#xff08;IT Service Management, ITSM&#xff09;体系扮演着至关重要的角色&#xff0c;而其中的服务台则是这一复杂体系的心脏地带。服务台不仅仅是解答技术疑问的一线窗口&#xff0c;更是企业IT运维效率与用户满意…

C++初探_关联容器

关联容器将键和值关联在一起&#xff0c;并使用键来查找值。STL提供的四种关联容器&#xff1a; &#xff08;1&#xff09;set 键类型与值类型相同&#xff0c;键值对一一对应&#xff1b; &#xff08;2&#xff09;multiset 键类型与值类型相同&#xff0c;一个键可能对…

FENDI CLUB啤酒,为何女生喜欢?

精酿啤酒已经成了女生喜欢的饮品&#xff0c;在日剧《无法成为野兽的我们》里&#xff0c;主人公小晶永远保持标准笑容&#xff0c;完美完成所有的工作。只有一个人的时候&#xff0c;她才会放下习惯性的微笑&#xff0c;显露自己的疲惫。小晶缓解疲惫&#xff0c;就是下班后去…

尽微好物:从0到10亿+的抖音电商的TOP1“联盟团长”,如何使用NineData实现上云下云

杭州尽微供应链是抖⾳平台⽉均带货10E的TOP1“联盟团⻓”&#xff0c;是字节跳动⼀级代理商&#xff0c;巨量千川指定服务商&#xff0c;拥有商品库9万&#xff0c;是⾏业领先的电商供应链平台&#xff0c;达⼈陪跑机构。 杭州尽微供应链以天猫、京东抖音电商业务为依托&#x…

代码随想录Day41(01背包问题):卡玛网46、Leetcode416

卡玛网46&#xff1a; 问题描述&#xff1a; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&#xff0…

HCIP-Datacom(H12-821)题库补充(5月16日)

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整题库请扫描上方二维码访问&#xff0c;持续更新中。 以下关于配置防火墙安全优先级的描述&#xff0c;错误的是哪一项&#xff1f; A&#xff1a;不新建与默认安全区域同名的安全区域 B&#xff1a;同一系统中&#xff0c…

「服务器」Nginx详解

本文主要介绍Nginx的原理和服务器部署Node.js项目。 一、Nginx原理 Nginx是一个高性能的HTTP服务器和反向代理服务器&#xff0c;它以高稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。以下是对Nginx的一些详解&#xff1a; 1. Nginx是什么&#xff1f; Nginx&#x…

镊子蜡烛如何设置止盈止损?Anzo Capital昂首资本盈利收场

通过上一篇文章各位聪明的投资者&#xff0c;都已经知道了什么是镊子蜡烛图以及如何抓住反转进行交易&#xff0c;同时也有很多投资者不知道如何设置止盈止损&#xff1f;今天Anzo Capital昂首资本就和各位投资者一起探讨如何盈利收场。 看跌的镊子模式如何交易&#xff1f;首…

【数据结构】树(Tree)

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 一、基本概念&#xff1a; 1、定义&#xff1a; ​编辑 ​编辑 2、树的成分&#xff1a; 3、树的性质&#xff1a; 二、存储方式&#xff1a; ​编辑 双亲表示法…

C++-float与double

float和double是两种不同的数据类型&#xff0c;用于存储浮点数&#xff08;小数&#xff09;。 1.精度&#xff1a; float是单精度浮点数&#xff0c;占用4个字节&#xff0c;通常精度为6-9位小数。 double是双精度浮点数&#xff0c;占用8个字节&#xff0c;通常精度为15-…

Open3D 点云多平面探测(Python)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Open3D为我们提供了一种点云多平面探测的算法,该算法使用基于鲁棒统计的方法进行平面补丁检测。该算法具体过程:首先将点云细分为更小的块(使用八叉树),然后尝试为每个块匹配一个平面。如果平面通过了鲁棒平面性…

【C语言每日题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ 学习了函数后&#xff0c;老师让我们用函数来实现上面这四个字符串函数。 我们首先来了解一下这四个字符串函数&#xff1a; 1.strlen函数 用于获取字符串长度&#xff08;不包括末尾…

【源码】相亲交友系统全新UI/情感测试/婚庆中介/交友系统

【交友】相亲交友系统全新UI/情感测试/婚庆中介/交友系统 带商城&#xff0c;情感测试。 https://www.52codes.cc/codes/qt

从开发板导出根文件系统并修改(Ubuntu)

前面提到过基于ubuntu-base去构建根文件系统基于Ubuntu-base构建根文件系统-CSDN博客&#xff0c;但是有时候我们并不需要重头开始&#xff0c;可以基于现有的根文件系统做调整。又或者我们直接在出厂的系统上去搭建好自己的运行环境并且编译出自己想要的程序&#xff0c;现在要…

医学科技查新中对查新点的撰写方法!附案例讲解!

我国的科技查新工作最早是从医学领域开始的&#xff0c;始于1985年中国科学院医学情报所&#xff0c;后来逐步发展到工、农等其 他各个领域。医学科技查新包括立项查新和成果查新两个部分&#xff0c;其中医学立项查新&#xff0c;它是指在医学科研项目申报开题之前&#xff0c…