面向对象的模型(内存分布)
  • 对于一个对象而言,成员变量和成员函数是分开存放的

    • 成员函数位于代码段,所有的类对象共有

    • 成员变量为每一个对象独有,位于内存中

  • 类对象在内存中的分布和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 ;
}
 #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++语法小记---面向对象模型(实例的内存分布)的更多相关文章

  1. 转:c++类实例在内存中的分配

    转自:http://blog.csdn.net/alexwei2009/article/details/6157926 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由 ...

  2. PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)

    面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...

  3. 八、面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)

    面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...

  4. 【转载】图说C++对象模型:对象内存布局详解

    原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...

  5. python基础----迭代器、生成器、协程函数及应用(面向过程实例)

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...

  6. Jinja2语法小记

    jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...

  7. PowerDesigner 面向对象模型(OOM)

    PowerDesigner 面向对象模型(OOM)说明 nulljavasystemstringpowerbuilderclass   目录(?)[+]   一.     OOM 简介 Object- ...

  8. 物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。

    物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了.   步骤如下: 一.反向生成物理数据模型PDM 开发环境 PowerDes ...

  9. python_如何为创建大量实例节省内存?

    案例: 某网络游戏中,定义了玩家类Player(id, name, status,....),每有一个在线玩家,在服务器程序内有一个Player的实例,当在线人数很多时,将产生大量实例(百万级别) 需 ...

随机推荐

  1. RocketMQ启动

    下载RocketMQ解压启动 > unzip rocketmq-all-4.4.0-source-release.zip > cd rocketmq-all-4.4.0/ > mvn ...

  2. DNS注册信息

    DNS注册信息查询可以查到注册时留下的信息,比如姓名,联系邮箱等等. 直接在命令行输入whois sina.com直接就可以看到sina.com的注册信息: Domain Name: SINA.COM ...

  3. Python3-queue模块-同步队列

    Python3中的queue模块实现多生产者,多消费者队列,特别适用于多个线程间的信息的安全交换,主要有三个类 queue.Queue(maxsize=0) 构造一个FIFO(先进先出)的队列 que ...

  4. JavaScript图形实例:图形放大镜效果

    1. 基本四瓣花型图案 根据四瓣花卉线的参数方程: t= r*(1+sin(12*θ)/5)*(0.5+sin(4*θ)/2); x=t*cos(θ)); y=t*sin(θ)); 编写如下的HTML ...

  5. 作为架构师必须知道的Netty原理和使用

    本文首发于微信公众号[猿灯塔],转载引用请说明出处 今天呢!灯塔君跟大家讲: Netty应用 一.Netty简介 1.Netty下载 官网:https://netty.io/downloads.htm ...

  6. Python趣味入门4:选择往往是最重要的-条件语句

    人生处处有选择,程序也有选择,为了让程序变得更加强壮,程序员必须考虑任何情况,上一篇了解到了如何使用Python来行顺序语句的编写,我们写了一个可以输入姓名的生日祝贺程序,今天我们挑战条件语句! 1. ...

  7. Cypress与TestCafe WebUI端到端测试框架简介

    近期接触了Cypress和TestCafe,两个测试框架都基于Node.js,都不再使用Selenium+WebDriver,而且开箱即用,非常轻量级,就冲着不再使用WebDriver这一点,极大地勾 ...

  8. (二)ansible 使用

    一,ansible 命令格式 #ansible <pattern> -m <module_name> -a <arguments> #单个服务器 ansible 3 ...

  9. 文件读取一些payload

    Windows: C:boot.ini //查看系统版本 C:WindowsSystem32inetsrvMetaBase.xml //IIS配置文件 C:Windowsrepairsam //存储系 ...

  10. Django---进阶7

    目录 图书管理的图书增删改查 choices参数(数据库字段设计常见) MTV与MVC模型 多对多三种创建方式 Ajax 小例子 作业 图书管理的图书增删改查 from django.shortcut ...