全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈C++对象的内存分布和虚函数表

c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。

1、非静态数据成员被放在每一个对象体内作为对象专有的数据成员。

2、静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。

3、静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体。在c++中类的成员函数都是保存在静态存储区中的 ,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份。

因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。

#include"iostream.h"
class A
{


private:
 int x;
 int y;


public:
 void sety()
 {
 y=5;
 }
 void print()
 {
 cout<<"x="<<x<<endl<<"y="<<y<<endl;
 }
};

void main()
{
 A a;
 a.sety();
 a.print();
 int *p=(int *)&a;//对象a的内存模型里面,只有非静态数据成员,所以是合理的。
 *p=6;
 a.print();
}

4、单继承的对象的内存布局,第一个为虚函数表指针vtbl,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替。

 <一> 上述类图的解释:B的v2覆盖了A的v2,C的v1覆盖了A的v1,C的v3覆盖了B的v3.

注意:发生覆盖的特征有:

1) 不同的范围(分别位于派生类与基类);

2) 函数名字相同;

3) 参数相同;

4) 基类函数必须有virtual关键字。

成员函数被重载的特征
 
(1)相同的范围(在同一个类中);
 
(2)函数名字相同;
 
(3)参数不同;
 
(4)virtual 关键字可有可无。

 
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
 
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
 
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)  

<二> 类C的对象的内存模型为:

单继承的对象的布局,第一个为虚函数表指针vtbl,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替。

5、与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表,当子类对父类的虚函数有重写时,子类的函数替换父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面。

<一> 对类图的解释:D的v3覆盖了B3的v3,另外D有一个新的虚函数vD。

<二> class D 的内存模型

总结:与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表,当子类对父类的虚函数有重写时,子类的函数覆盖父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面

6. 虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移。

<一>类图的解释:D2覆盖了B的vB,GD覆盖了D1的vD1同时也覆盖B的vB,GD也有自己的虚函数vGD。

<二> class GD的内存模型

总结:虚继承,使公共的基类在子类中只有一份,我们看到虚继承在多重继承的基础上多了vbtable来存储到公共基类的偏移

以上就是小编为大家带来的浅谈C++对象的内存分布和虚函数表全部内容了,希望大家多多支持~


# 虚函数表  # 内存  # C++虚函数表与类的内存分布深入分析理解  # C++内存分布及用法  # 解析C++类内存分布  # C++ 类中有虚函数(虚函数表)时 内存分布详解  # C++对象内存分布详解(包括字节对齐和虚函数表)  # C++浅析程序中内存的分布  # 子类  # 第一个  # 重写  # 类中  # 放在  # 的是  # 派生类  # 多个  # 绑定  # 就由  # 加在  # 区中  # 后为  # 上多  # 自己的  # 都是  # 有一  # 是在  # 也有  # 都不 


相关文章: 海南网站制作公司有哪些,海口网是哪家的?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何快速打造个性化非模板自助建站?  宝塔新建站点为何无法访问?如何排查?  网站专业制作公司有哪些,做一个公司网站要多少钱?  网页设计与网站制作内容,怎样注册网站?  如何选择最佳自助建站系统?快速指南解析优劣  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  如何在阿里云服务器自主搭建网站?  如何配置支付宝与微信支付功能?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  建站之星安装步骤有哪些常见问题?  手机网站制作与建设方案,手机网站如何建设?  宿州网站制作公司兴策,安徽省低保查询网站?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  活动邀请函制作网站有哪些,活动邀请函文案?  PHP 500报错的快速解决方法  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  北京网站制作网页,网站升级改版需要多久?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  郑州企业网站制作公司,郑州招聘网站有哪些?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  如何基于PHP生成高效IDC网络公司建站源码?  图册素材网站设计制作软件,图册的导出方式有几种?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  建站OpenVZ教程与优化策略:配置指南与性能提升  建站DNS解析失败?如何正确配置域名服务器?  潮流网站制作头像软件下载,适合母子的网名有哪些?  为什么Go需要go mod文件_Go go mod文件作用说明  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  中山网站推广排名,中山信息港登录入口?  建站之星图片链接生成指南:自助建站与智能设计教程  建站之星安装失败:服务器环境不兼容?  平台云上自助建站如何快速打造专业网站?  高端建站如何打造兼具美学与转化的品牌官网?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  javascript中对象的定义、使用以及对象和原型链操作小结  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  建站主机服务器选型指南与性能优化方案解析  如何将凡科建站内容保存为本地文件?  制作门户网站的参考文献在哪,小说网站怎么建立?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  建站之星如何实现五合一智能建站与营销推广?  如何使用Golang安装API文档生成工具_快速生成接口文档  定制建站流程步骤详解:一站式方案设计与开发指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。