C++语法小记---面向对象模型(实例的内存分布)
面向对象的模型(内存分布)
对于一个对象而言,成员变量和成员函数是分开存放的
成员函数位于代码段,所有的类对象共有
成员变量为每一个对象独有,位于内存中
类对象在内存中的分布和struct完全相同
对于继承,子类的对象是在父类的对象的基础上,加上子类自己的成员
#include <iostream>
#include <string> using namespace std; class Test
{
int mi;
public:
Test(int i = ) //转换构造函数
{
mi = i;
} void showMI()
{
cout<<"Test mi = "<< mi <<endl;
}
}; class Test1: public Test
{
int mj;
public:
Test1(int j = )
{
mj = j;
} void showMJ()
{
cout<<"Test mj = "<< mj <<endl;
}
}; struct T //T的结构和Test2的内存结构完全相同
{
int mi;
int mj;
}; int main()
{
Test2 t; T *p = reinterpret_cast<T *>(&t);
p->mi = ;
p->mj = ; t.showMI();
t.showMJ(); return ;
}
- 如果类中有虚函数,那么对象中有一个指向虚函数类表的指针位于每一个对象中
#include <iostream>
#include <string> using namespace std; class Test
{
int mi;
public:
Test(int i = ) //转换构造函数
{
mi = i;
} virtual void showMI()
{
cout<<"Test mi = "<< mi <<endl;
}
}; class Test1: public Test
{
int mj;
public:
Test1(int j = )
{
mj = j;
} virtual void showMJ()
{
cout<<"Test mj = "<< mj <<endl;
}
}; struct T //T的结构和Test2的内存结构完全相同
{
void *p;
int mi;
int mj;
}; int main()
{
Test2 t; T *p = reinterpret_cast<T *>(&t);
p->mi = ;
p->mj = ; t.showMI();
t.showMJ(); return ;
}
- 对于多继承(不建议使用),按照继承时声明的顺序依次叠加父类的情况,最后跌倒子类自己的成员
https://www.cnblogs.com/longcnblogs/archive/2017/10/09/7642951.html
如果继承的父类都有虚函数,那么子类中有多个指向虚函数函数表的指针
#include <iostream>
#include <string> using namespace std; class Test
{
int mi;
public:
Test(int i = ) //转换构造函数
{
mi = i;
} virtual void showMI()
{
cout<<"Test mi = "<< mi <<endl;
}
}; class Test1
{
int mj;
public:
Test1(int j = )
{
mj = j;
} virtual void showMJ()
{
cout<<"Test mj = "<< mj <<endl;
}
}; class Test2 : public Test, public Test1
{
int mk;
public:
Test2(int k = )
{
mk = k;
} void showMK() //增加了虚函数
{
cout<<"Test mk = "<< mk <<endl;
}
}; struct T //T的结构和Test2的内存结构完全相同
{
void *p; //多了一个指向虚函数表的指针
int mi;
void *p1; //多了一个指向虚函数表的指针
int mj;
int mk;
}; int main()
{
Test2 t; T *p = reinterpret_cast<T *>(&t);
p->mi = ;
p->mj = ;
p->mk = ; t.showMI();
t.showMJ();
t.showMK(); return ;
}
C++语法小记---面向对象模型(实例的内存分布)的更多相关文章
- 转:c++类实例在内存中的分配
转自:http://blog.csdn.net/alexwei2009/article/details/6157926 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由 ...
- PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)
面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...
- 八、面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)
面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...
- 【转载】图说C++对象模型:对象内存布局详解
原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...
- python基础----迭代器、生成器、协程函数及应用(面向过程实例)
一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...
- Jinja2语法小记
jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...
- PowerDesigner 面向对象模型(OOM)
PowerDesigner 面向对象模型(OOM)说明 nulljavasystemstringpowerbuilderclass 目录(?)[+] 一. OOM 简介 Object- ...
- 物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。
物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了. 步骤如下: 一.反向生成物理数据模型PDM 开发环境 PowerDes ...
- python_如何为创建大量实例节省内存?
案例: 某网络游戏中,定义了玩家类Player(id, name, status,....),每有一个在线玩家,在服务器程序内有一个Player的实例,当在线人数很多时,将产生大量实例(百万级别) 需 ...
随机推荐
- 一个非侵入的Go事务管理库——工作原理
在上一篇文章"一个非侵入的Go事务管理库--如何使用"中,我讲述了如何使用事务库.有些读者可能读过"清晰架构(Clean Architecture)的Go微服务: 事物管 ...
- Mac OS 生成 icon 和 ico 文件
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 1. 生成 IC ...
- 旷世提出类别正则化的域自适应目标检测模型,缓解场景多样的痛点 | CVPR 2020
论文基于DA Faster R-CNN系列提出类别正则化框架,充分利用多标签分类的弱定位能力以及图片级预测和实例级预测的类一致性,从实验结果来看,类该方法能够很好地提升DA Faster R-CNN系 ...
- 第三章:软件也要拼脸蛋-UI 开发的点点滴滴
常用控件 常用控件有:按钮 Button.文本显示框 TextView.图片显示框 ImageView.文本编辑框 EditText.进度条 ProgressBar.提示框 AlertDialog.进 ...
- 线程基础8-quene讲解
PriorityBlockingQueue是一个基于优先级堆的无界的并发安全的优先级队列(FIFO),队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取 ...
- 使用java类的方式配置spring 需要什么注解?
1.@Configuration 修饰类,声明当前类是一个配置类,相当于applicationContext.xml文件 2.@ComponentScan 用于指定spring在初始化容器时要扫描的包 ...
- java基础-java与c#的可变参数
正文 可变参数,必须最为参数的最后一个参数:可变参数只能有一个: c#可变参数例子: class Program { static void Main(string[] args) { T ...
- Java 比较对象中的内容是否一致
获取对象中的所有属性 private static Field[] getAllFields(Object object) { Class clazz = object.getClass(); Lis ...
- mybatis缓存之一级缓存(二)
这篇文章介绍下mybatis的一级缓存的生命周期 一级缓存的产生 一级缓存的产生,并不是看mappper的xml文件的select方法,看下面的例子 mapper.xml <select id= ...
- python高阶-Linux基础命令集
声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 1: 查看文件信息:ls ls常用参数: 参数 含义 -a 显示指定目录下所有子目录与文件,包括隐藏文件 -l 以 ...