通过上面整个关于对象的基础知识框架,我们来分析两个例子,看一下在内存中,对象究竟长什么样。

 

Demo1:C++对象模型的内存布局

class Point {
public:
Point( float xval );
virtual ~Point(); float x() const;
static int PointCount(); protected:
virtual ostream&
print( ostream &os ) const;
float _x;
static int _point_count;
]};

对于上面这个Point类,在内存中是怎么布置起来的呢?

  1. 我们将这个问题分为几个小问题,考虑篇幅,答案直接给在问题后面:
  2. 构造函数存放在什么位置?(答:类外或者类内,由构造函数的定义位置所决定)
  3. 析构函数存放在什么位置?(答:虚函数表中的一个表项指向,即指针指向)
  4. nonstatic member function,这里为x()函数,存放在什么位置?(答:由构造函数的定义位置所决定)
  5. static member function,这里为PointCount(),存放在什么位置?(答:类外)
  6. 虚函数放在什么位置?(答:虚函数表中的一个表项指向,即指针指向)
  7. nonstatic data member放在什么位置?(答:类内)
  8. static data member放在什么位置?(答:类外)

根据以上这些问题,我们可以给出如下的对象布局方式:

由此可见,对于虚函数来说,它们由一个虚函数表统一管理,而在对象中只存放指向该虚函数表的指针。

 

Demo2:子类的对象布局

在Demo1中,我们了解了一个对象在内存中是如何存放的,现在我们给它加上继承机制

即父类派生的子类的对象在内存中是如何布局的

看下面这段代码:

class ZooAnimal {
public:
ZooAnimal();
virtual ~ZooAnimal();
// ...
virtual void rotate(); protected:
int loc;
String name;
}; class Bear : public ZooAnimal {
public:
Bear();
~Bear();
// ...
void rotate();
virtual void dance();
//....
protected:
enum Dances { ... }; Dances dances_known;
int cell_block;
}; class Panda : public Panda {
// ........
};

这里使用了二层继承 ZooAnimal <--- Bear <--- Panda.

思考下面这段代码,在内存中的布局是怎样的呢?

{
ZooAnimal za; // 对象分配在栈上
ZooAnimal *pza; // 指针分配在栈上 Bear b; //对象分配在栈上
Panda *pp = new Panda // pp指针分配在栈上,对象new在堆中 pza = &b;
}

根据注释上所说,我们在内存中的相应的位置,按顺序设想一下该段代码执行后内存中栈和堆的布局情况:

这个图中并没有考虑栈和堆的增长方向不同的因素,所以这里也就不深究。

栈中发生了什么很容易看得出,我们着重看一下在堆中的Panda对象的内存分布:

发现Panda对象被分成了三个部分,Panda对象 = Panda对象自己的一部分+Bear对象部分(Bear对象部分 = Bear对象自己的一部分 +基类ZooAnimal部分)

在栈中的Bear对象也是同样的道理。

由此图,我们大致了解了子类在内存中的布局。

因此,父类和子类之间的类型转换,即多态的实现,就可以认为是指针的覆盖范围的变换,而对内存布局没有影响。

 

小结:

简单探讨了一下对象在内存中的布局问题,以及如果通过布局来实现继承和多态的。

 

如果不正确的地方欢迎指正。

参考资料:

《深入理解C++对象模型》

深入探索C++对象模型(1) 关于对象(思维导图)的更多相关文章

  1. C#-常用对象-思维导图

    C#-常用对象-思维导图 链接:http://pan.baidu.com/s/1jHNgS78 密码:3i74 如有错误,请告知我!

  2. BOM对象思维导图

  3. Python--day26--面向对象思维导图

  4. JavaScript思维导图—Window对象

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  5. javaSE_07Java中类和对象-封装特性-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 : 2)右击在新标签中打开放大查看 (IE不支持,搜狗,360可以):

  6. [Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合

    依据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:

  7. 精心整理「服务器Linux C/C++」 成长路程(附思维导图)

    前言 我不是名校毕业,更没有大厂的背景,我只是一个毕业不到 2 年的普普通通的程序员,在摸爬滚打的工作这段时间里,深知了有一个「完整的知识体系」是非常重要的.当事人非常后悔没有在大学期间知道这个道理- ...

  8. 跟着9张思维导图学习Javascript

    学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将 po 出我收集的 9 张 javascript 相关的思维导图(非原创). 思维导图小tips: 思维导图又叫心智图,是表达发射性思维的 ...

  9. 各种图(流程图,思维导图,UML,拓扑图,ER图)简介

    来源于:http://www.cnblogs.com/jiqing9006/p/3344221.html 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有 ...

  10. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

随机推荐

  1. redis linux安装过程回顾

    1,官网wget http://download.redis.io/releases/redis-3.2.9.tar.gz 2,解压 tar zxf redis-3.2.9.tar.gz 后进入解压后 ...

  2. Table '.\gts\eventdata#P#p0' is marked as crashed and last (automatic?) repair failed

    修复数据表操 MYSQL数据表出现问题,提示:Error: Table './db_name/table_name' is marked as crashed and last (automatic? ...

  3. 《python灰帽子》学习笔记:调试器设置

    一.构造 C  数据类型 C Type | Python Type | ctypes Type ____________________________________________________ ...

  4. vue测试安装和配置

    npm install --save-dev @vue/test-utils mocha mocha-webpack npm install --save-dev jsdom jsdom-global ...

  5. xcode发布ipa

    --------Xcode------- product 产品 archive 存档 (等) distribute app 分发app development 开发者 next next (等 比较漫 ...

  6. Git的常用撤销技巧与解决冲突方法

    git checkout . #本地所有修改的.没有的提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面.可用git stash pop回复. git rese ...

  7. module使用和设置

    Modules environmentDescription This is a system that allows you to easily change between different v ...

  8. Java设计模式-监听器模式

    监听器模式有三个要素——事件源.事件对象.监听器. 事件源:顾名思义,事件发生的源头,比如点击的按钮,属于被监听的对象: 事件对象:这个经常和事件源混淆,它经常被用来包装事件源,切记,它毕竟是个事件, ...

  9. JAVA是否允许返回值类型不同的重载overload或覆盖override

    在看<Thinking in java>的时候,看到子类的方法和父类的方法名字相同,但是返回值类型不同,然后就开始怀疑这属于覆盖吗,到网上找到了答案,分析见接下来的网址: http://g ...

  10. 基础语言知识C++

    强制转换: (Cplusplus基础与提高(何桂林)21页) static_cast:有隐式转换的 格式: static_cast<目标类型> (标识符) int a = 10; int ...