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.单继承的对象的内存布局,第一个为函数指针vptr,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以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的对象的内存模型为:


单继承的对象的布局,第一个为虚函数表指针vptr,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替。
5.与单继承相同的是所有的虚函数都包含在虚函数表中,所不同的多重继承有多个虚函数表,当子类对父类的虚函数有重写时,子类的函数替换父类的函数在对应的虚函数位置,当子类有新的虚函数时,这些虚函数被加在第一个虚函数表的后面

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

<二>class D 的内存模型


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

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

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

<二> class GD的内存模型


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

转载于:https://blog.51cto.com/boyishachang/1285961

C++对象的内存分布和虚函数表相关推荐

  1. C++中的类对象的内存分布以及虚函数表内存分布

    ​ 目录 目录 一.前言 二.C++ 类对象的内存布局 三.函数调用 一.前言 C++的精髓是虚函数.虚函数带来的好处就是:可以定义一个基类的指针,其指向一个继承类,当通过基类的指针去调用函数时,可以 ...

  2. C++对象内存布局--①测试虚函数表属于类

    C++对象内存布局--①测试虚函数表属于类 测试1:同一个类的多个对象共享同一张虚函数表.   //虚函数表.cpp //2010年8月18日 //测试虚函数表,说明虚函数表属于类所有.同一个类的多个 ...

  3. 【C++】 类的内存对齐、虚函数表

      本文分为以下几个部分内容: 什么是内存对齐,为什么要内存对齐 C++的空类,以及没有虚函数和非静态变量的类 C++类的内存分布(成员变量) C++类的内存分布(虚函数) 一个类的情况 继承关系中的 ...

  4. C++虚函数表,虚表指针,内存分布

    虚函数表和内存分布那一块转载自:https://blog.twofei.com/496/ 虚函数效率转载自:https://www.cnblogs.com/rollenholt/articles/20 ...

  5. C++对象的内存布局1---基础篇----C++ 虚函数表解析

    [-] 前言 虚函数表 一般继承(无虚函数覆盖) 一般继承(有虚函数覆盖) 多重继承(无虚函数覆盖) 多重继承(有虚函数覆盖) 安全性 结束语 附录一:VC中查看虚函数表 附录 二:例程 前言 C++ ...

  6. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

  7. C++ 虚函数表 vfptr

    前言 大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. ...

  8. C++ 虚函数表 vfptr详解

    前言 大家都应该知道C++的精髓是虚函数吧? 虚函数带来的好处就是: 可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数. ...

  9. 虚函数表剖析,网上转的,呵呵

    http://www.cppblog.com/xczhang/archive/2008/01/20/41508.html C++虚函数表解析(转) C++中的虚函数的作用主要是实现了多态的机制.关于多 ...

  10. C++ 虚函数表解析

    转载自 https://blog.csdn.net/zhou191954/article/details/44919479 C++ 虚函数表解析 前言 C++中的虚函数的作用主要是实现了多态的机制.关 ...

最新文章

  1. 定义简单类-接收对象的变量同样是对对象的引用
  2. 高德地图安卓 拖拽选点_行车记录仪当“眼睛” 高德地图手机AR导航再次升级...
  3. TCP/IP Checksum 吐槽
  4. java 4种跟踪会话技术_会话跟踪技术
  5. java list top_Java程序员最常犯的错误盘点之Top 10
  6. 1799元起!66W超级快充+120Hz全视屏 荣耀Play5 活力版正式发布
  7. python中raise stoplteration_Python面向对象学习笔记3
  8. linux内核初始化卡死,armlinux内核启动--内存初始化管理
  9. spring思想分析
  10. CentOS 修改默认语言
  11. 使用nslookup查看邮箱信息
  12. 大数据在推荐系统中的作用
  13. 普通键盘Windows上虚拟Cherry机械键盘效果的方法
  14. DataCastle员工离职预测数据竞赛个人总结
  15. 永中word页码怎么从第二页开始_永中PDF产品升级!Now注册即享VIP~
  16. css 选父元素,CSS中模拟父元素选择器
  17. 数据结构与算法06-栈的应用
  18. 如何提取论文中的表格数据(pdf转换excel)
  19. 撤销院士称号!两名原院士,被当作反面典型通报
  20. 关于myeclipse10.7破解的问题(破解不成功显示只有五天可用可激活)

热门文章

  1. paip.输入法编程---词频顺序order by py
  2. C#.NET com组件的编写
  3. 中基协会长洪磊:尽快制定大类资产配置管理办法 推非保本理财转型
  4. 不确定性原理的前世今生 · 数学篇(二)
  5. 一款跑在云上的定制容器专属 OS
  6. 逆袭?或将掌舵万亿SaaS巨头的Taylor竟是“天选之人”
  7. 申通完美支撑“双11”亿级包裹背后的云基础设施
  8. 【cherry键盘白送】有人在云上送来一波双十一福利
  9. 文荣:7月24日阿里云上海峰会网络大神
  10. 【配送路径规划】基于matlab遗传算法求解带时间窗的多配送中心半开放式车辆路径规划问题【含Matlab源码 YC002期】