C++ 虚函数机制-(转载)

深入浅出C++虚函数:从底层原理到实战应用 C++虚函数原理与应用解析:本文系统介绍了C++中虚函数的核心机制与实用技巧。深入剖析虚函数表(vtable)和虚指针(vptr)的工作原理,解释动态绑定的实现过程。重点说明不能声明为虚函数的场景(内联函数、构造函数等),强调虚析构函数的重要性。结合实际应用案例(插件系统、图形绘制等)展示虚函数的多态优势,并分析其性能开销。最后推荐系统学习资源,帮助开发者全面掌握C++多态特性,写出高效灵活的面向对象代码。 阅读详情

2:对虚函数的理解(virtual)
2.1:只有申明为virtual的函数才能动态绑定(late binding),缺省情况下函数不具有该特性。
这说明一个问题:静态绑定和动态绑定的区别
静态绑定是在程序编译时期就一定分配好了地址,绑定完毕。
动态绑定就是只有等到程序运行时刻执行到这一条语句的时候,才确定调用的哪一个函数。
而实现动态绑定,只有在有virtual的情形下才有意义。所以可以这么理解:virtual函数可以用来实现动态绑定;
动态绑定也只有在virtual存在的情况下才具有意义。

2.2:多态:允许子类的指针赋值给父类的指针。一种常见的情形就是父类的指针指向了派生类的对象。
所谓多态:必须用virtual来实现,这个是前提条件。而虚函数的作用,就是在执行期实现动态绑定。
多态----虚函数----动态绑定:三者的关系。

2.3:若基类定义了虚函数,则基类会生成一张虚函数表,这张表里保持着类中虚函数的地址。
当然,要操作这张虚函数表,就必须有一个虚函数指针来遍历这张表。而这虚函数表指针什么时候创建?
又是属于类,还是对象的呢?
虚函数表,是属于类的,因为只要有虚函数,类就会创建虚函数表。
而指向虚函数表的指针则是属于对象的,只有当一个对象创建时刻,在调用默认构造函数的时刻,才创建这个虚函数表
指针 ,这就解释了为什么虚函数可以用来实现多态。vptr是在运行时刻创建的(对象创建时)。
类对象包含有的东西:非静态的数据成员,以及(有虚函数时候)一个vptr。就这些东西。
那些类中的成员函数,都是在代码段,这些函数是借口,供外界调用。
类中可以有静态的数据成员,以及静态的方法:静态的数据成员,是在静态区(全部变量,static变量都放在那里,
还有字面值常量也在那里),静态方法只能调用静态的数据成员。这个在单件模式中,应用到了。
这里会有很多sizeof的问题,仔细分析应该没有任何问题。

2.4:基类和派生类的关系
首先是对基类和派生类都求sizeof()的问题

(a):测试代码
#include
< iostream >
using namespace std;

class A
{
public :
int m;
private :
int n;
};

class B : public A
{
public :
int k;
};

int main()
{
A a;
cout
<< sizeof (a) << endl; // 8
B b;
cout
<< sizeof (b) << endl; // 12
return 0 ;
}
sizeof (a) = 8 ,很容易知道。
sizeof (b) = 12 ,这就说明了基类的private成员变量也被继承到派生类中,只是派生类无法直接去访问
这些基类的private成员。但,仍然可以通过派生类的对象去调用从基类继承下来的成员函数,去访问这些
基类的私有成员变量。
(b):测试代码:说明上面这个问题
--- 派生类对象去调用基类方法访问基类私有成员变量。
#include
< iostream >
using namespace std;

class A
{
public :
int m;
A()
{
n
= 10 ;
}
void Count()
{
n
++ ;
}
void Print()
{
cout
<< n << endl;
}
private :
int n;
};

class B : public A
{
public :
int k;

};

int main()
{
A a;
cout
<< sizeof (a) << endl; // 8
B b;
cout
<< sizeof (b) << endl; // 12
b.Count();
b.Print();
// 11
return 0 ;
}
 

2.5:再谈虚函数问题 <派生类的虚函数表 >
基类的虚函数,会派生到派生类的虚函数表中,而且在派生类虚函数表中的位置和这个虚函数在基类表中的
位置是一样的。若是派生类重写了基类的某个虚函数,则在派生类虚函数表中把重写的虚函数的地址放进去,
覆盖掉原来基类那个虚函数的地址,这就是当基类的指针指向派生类的对象的时候,会根据这个对象的虚函数表
指针找到这张虚函数表,去调用这个虚函数:若派生类改写,则调用的是派生类的虚函数,若未改写,则调用的
还是基类的虚函数。这就是多态的具体实现哦......(咳,不知道说清楚没有...)

 

2.6:纯虚函数
这个问题困扰了很久,主要是搞不清楚里面的实现机制是怎么回事!
纯虚函数,一般是在基类中才有纯虚函数,也只有这样才具有意义。
声明一个虚函数的时候把它设置为0,就是纯虚函数了。具有纯虚函数的基类,就是虚基类,这个类不能实例化,
只提供接口。为什么不能实例化呢?主要是纯虚函数的地址在虚函数表中无法确定,所以不能实例化。
一个经常性的用法:把基类的析构函数设置为纯虚函数。
这样的好处:可以防止内存泄露。当基类的指针指向派生类对象时,在程序结束时,delete p(p为基类指针),
接下来发生的事情是:首先会调用派生类的析构函数,清理派生类的这块内存,接着删除掉这块内存;
再调用基类的析构函数,清理基类的这块内存,在删除掉这块内存。这就保证了不发生内存泄露。
若:基类的析构函数未声明为纯虚函数,则在delete p的时候,就不会去调用派生类的析构函数去完成派生类
内存清理工作了,发生内存泄露。
当基类的析构函数声明为纯虚函数时,那派生类的析构函数也是虚函数。
构造函数不可以被声明为虚 的,为什么呢?
举个例子:基类A和派生类B,B继承自A,A的构造函数声明为虚函数,则在A类的虚函数表中就登记了这个虚构造函数
的地址。好,现在A创建一个对象a,则要去调用构造函数完成初始化工作,问题出来了,这个构造函数已经登记在虚函
数表中,我没办法找打它,为什么呢?因为我要通过一个vptr去找遍历这个虚函数表,而这个时候vptr没有。为什么没有呢?
因为,vptr是在创建对象的时候,调用默认构造函数的时候才创建的。
这是一个死循环:我要调用构造函数,而构造函数在虚函数表中;那就需要一个vptr去访问这个虚函数表;而这个
vptr却是在默认构造函数中才创建的,而此刻这个构造函数却在虚函数表中。结果就是找都找不到这个构造函数。

C++虚函数实现多态的机制 虚函数是C++实现多态的机制,那么它是如何做到的呢? 以下通过反汇编探索虚函数内存模型,查看虚函数实现多态的过程。 工具 Visual studio 2017:以下程序仅做VC++编译器下的32位程序探讨,其他编译器与64位程序所产生的差异不作讨论。 反汇编过程 首先声明一个不包含虚函数的简单C++类,如下: 在构造函数中加入断点,使得反汇编构造函数代码,如图: 当运行到断点时,在Visual... 阅读详情

相关推荐

C++中虚函数的实现机制

介绍了C++编程语言中的虚函数及其在进行面向对象程序设计中重要性,并且详细阐述了它在编译器底层虚函数的实现机制.它通过一个vptr和vtable在运行时进行动态绑定,从而能够根据对象类型的不同调用不同的 虚函数;并通过实例测试验证了上述机制.

详解C++虚函数原理

1、虚函数 虚函数是类中比较特殊的成员函数,通过在普通成员函数的前面加上“virtual”关键字声明。因为基类指针不能访问派生类的普通成员函数,但是可以访问派生类的虚函数,所以虚函数是实现C++多态性的关键。 派生类继承了基类的虚函数并重新定义(重写、覆盖)虚函数,通过基类指针去指向其派生类对象,进行动态绑定(延迟绑定),达到利用基类访问派生类虚函数的目的。如果没有虚函数,则总被限制在基类函数本身,无法调用派生类中被重写的函数。 2、虚函数实现原理 虚函数表 虚函数表指针 类对象在内存中的布

fscanf_fread的博客 2431

VXLAN技术详解

VXLAN(虚拟可扩展局域网)是一种Overlay二层虚拟化技术,通过MAC-in-UDP封装在IP网络上构建大规模虚拟二层网络。核心组件包括VTEP(隧道端点)、24位VNI(支持1600万个虚拟网络)和VXLAN网关。相比VLAN,VXLAN具有超大规模扩展、跨三层互联、支持虚拟机无缝迁移等优势,适用于云数据中心多租户隔离、跨数据中心互联等场景。其基于IP路由的封装方式无需改造物理网络,为现代云网络提供了弹性、安全的虚拟化解决方案。

kjkdd的博客 594

C++虚函数原理

前言 C++的特性使得我们可以使用函数继承的方法快速实现开发,而为了满足多态(Polymorphism)这一性质,C++允许用户使用虚函数 (virtual function) 来完成 运行时决议 这一操作,这与一般的 编译时决定 有着本质的区别。多态的目的,就是要让处理“基类之对象”的程序代码,能完全无障碍的处理“派生类之对象” 虚函数表 对C++ 了解的人都应该知道虚函数(Virtual...

sinat_31608641的博客 2764

Unity动态创建Avatar骨骼映射

Unity Avatar骨骼映射动态创建,适配Unity通用动画,无需经过第三方建模软件,可运行时创建

Nbin_Newby的博客 1万+

App渗透 - 人脸识别登录绕过

一、APP抓包和逆向破解加密算法打开APP是一个登录框抓包后发现参数被加密了使用Jadx脱源码发现,并没有加壳也没有混淆,运气很好根据经验,先搜索Encrypt、Decrypt等关键字,发现在Common.js中有一个encryptData函数定位过去,一套加解密算法都写好了放在这放到浏览器console里面调试,果然没错二、寻找注入点首先测试了一下注入明文:{"userName":"TEST'...

渗透测试研究中心 2823

C++中的虚函数机制

C++默认的静态绑定,在查找和关联的过程中是在编译期间完成的,普通函数,重载函数和成员函数都是静态绑定;//普通函数//重载函数//成员函数//都是静态绑定,能够提高程序的性能func(100);

zy_Leader的博客 1350

YOLOv11n-seg 实战指南:从训练到模型部署的完整流程

本文提供了YOLOv11n-seg实例分割模型从环境准备、数据标注到模型训练、验证及最终部署的完整实战指南。详细讲解了如何准备多边形掩码数据、配置关键训练参数、解读分割核心评估指标,并重点介绍了将模型导出为ONNX等格式进行部署的流程与优化技巧,帮助开发者高效完成从开发到生产的全链路实践。

weixin_29062255的博客 553

深度解码C++虚函数:原理、作用与最佳实践

虚函数是在父类中定义的一种特殊类型的函数,允许子类重写该函数以适应其自身需求。虚函数的调用取决于对象的实际类型,而不是指针或引用类型。通过将函数声明为虚函数,可以使继承层次结构中的每个子类都能够使用其自己的实现,从而提高代码的可扩展性和灵活性。在C++中,使用关键字"virtual"来定义虚函数。} };} };Animal类有一个虚函数makeSound(),它被Cat和Dog类继承并覆盖了该函数以实现不同的行为。

Lion_Long的博客 2067

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

【光子 AI】AI Agent 知识体系深度研究报告

从理论基础到前沿应用:全面解析人工智能代理的核心架构、关键技术与发展趋势📅 2026 年 3 月 | 📊 深度研究报告 | 🔬 人工智能领域 | 📈 前沿技术分析**AI Agent(人工智能代理)**是一种能够感知环境、基于所获得的信息做出决策,并执行行动以影响该环境的软件系统。AI Agent 的设计旨在模仿或实现智能行为,它们可以在各种环境中操作,包括物理世界和虚拟空间。随着大语言模型(LLM)技术的突破性进展,AI Agent 正从实验室研究快速走向产业应用。根据 Gartner 发布的《2

AI天才研究院 176

C++虚函数表机制详解

在C++中,虚函数表(vtable)是实现动态多态的核心机制。核心机制:虚函数表通过存储虚函数地址和vptr实现动态绑定。多态实现:允许基类指针调用派生类函数。编译器依赖:具体实现(如vptr位置、vtable结构)因编译器而异。理解虚函数表有助于深入掌握C++多态原理及对象内存模型,但对实际开发而言,应遵循面向对象设计原则,而非直接操作虚函数表。

m0_45371381的博客 1230

YOLOv8 更换损失函数DIoU、EIoU、GIoU...Inner-IoU...

介绍了一些损失函数,并将其应用到yolov8训练中

分享一些自己改进代码的实例 888

C++虚函数的实现机制(转载)

文章地址:https://blog.youkuaiyun.com/neiloid/article/details/6934135 C++虚函数的实现机制 虚函数表:在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。 多重继承时,比如:子类继承自父类A,父类B,父类C,且4个类都...

写给自己看的博客 1159

uniapp - 解决真机调试报错 request:fail abort statusCode:-1 java.security.cert.CertPathValidatorException: Tr

uni-app,真机调试报错,app端平台,安卓Android,安卓App发布线上报错,打包后接口请求失效了,api接口报错,真机运行安卓app时接口不通且报错,request:failabortstatusCode:-1java.security.cert.CertPathValidatorException:Trustanchorforcertificationpathnotfound.,真机调试,苹果ios真机报错,Uniapp打包到app后报错,uni-app真机调试报错,服务器

🏆 前端领域优质创作者 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

转载:C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

qq_22677425的博客 317

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

子类重写父类虚函数_C++虚函数详解(转载)

前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不做过多的...

weixin_39631951的博客 3673

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++虚函数详解&实现机制&多态性

转载:http://blog.chinaunix.net/uid-24178783-id-370328.html

我的博客 1897

c++虚函数的作用是什么?

作者:wuxinliulei 链接:https://www.zhihu.com/question/23971699/answer/69592611 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 首先强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。定义一个函数为纯虚函数,才代表函数没有被实现。...

legalhighhigh的博客 3330

C++ 虚函数表解析(转载)

作者:陈皓          C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。  虚函数

学习记录专栏 1544

C++ 虚函数表解析_转载于陈皓

C++虚函数表

xu_fu_yong的专栏 407

C++常见面试题:虚函数实现原理

转载地址:http://blog.youkuaiyun.com/wanghaobo920/article/details/7674631前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技

blog 5900

C++ 虚函数

本文转自http://blog.youkuaiyun.com/haoel/article/details/1948051/本篇博文转自大牛陈皓的博客,是目前看到的对C++虚函数讲解比较详细的文章之一,所以转载一下学习学习。 另外还有两篇也写的很好,可以参考学习: http://www.cnblogs.com/jerry19880126/p/3616999.htmlhttp://www.cnblogs.com

~探路者~的博客 486

C++中虚函数的作用和虚函数的工作原理

【转载】https://www.cnblogs.com/zkfopen/p/11061414.html 1. C++中虚函数的作用和多态 虚函数: 实现类的多态性 关键字:虚函数;虚函数的作用;多态性;多态公有继承;动态联编   C++中的虚函数的作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数;在派生类中对基类定义的虚函数进行重写时,需要在派生类中声明该方法为虚方法。   当子类重新定义了父类的虚函数后,当父类的指针指向子类对象的地址时,[即B b; A a = &b;] 父类指针根

BERLIN23的博客 627
上一篇: Linda面试题-详解
下一篇: C++虚函数表解析(转)
devilkin64
博客等级 码龄19年 16粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值