C++对象的内存分布和虚函数表
来源:互联网 发布:华美卷皮最新源码 编辑:程序博客网 时间:2024/05/16 04:50
C++对象的内存分布和虚函数表
转自:http://blog.sina.com.cn/s/blog_60e96a410100lirk.html
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来存储到公共基类的偏移
阅读全文
0 0
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- C++对象的内存分布和虚函数表
- 【C++】虚函数和虚继承的内存分布情况
- C++对象的内存分布和虚函数表 http://blog.sina.com.cn/s/blog_60e96a410100lirk.html
- C++对象内存分布(包括字节对齐和虚函数表)
- 虚基类、虚函数,对象内存分布
- 虚基类、虚函数,对象内存分布
- 虚基类、虚函数,对象内存分布
- 转载:虚函数和虚继承的内存分布
- iOS开发抓包工具之Charles使用
- SQL介绍
- MyBatis对象关系映射--- 多对一
- Word2vec 原理公式推到和代码实现
- java.util.Date和java.sql.Date的区别及应用
- C++对象的内存分布和虚函数表
- Ubuntu16.04 Jupyter安装(Ipython Notebook安装)
- androidStudio打包apk混淆配置
- 研究了100多个创业失败案例后,这里有7个血色教训
- 限制容器的 Block IO
- 自适应布局下的图片垂直水平居中,自适应手机横竖屏
- c++ list, vector, map, set 区别与用法比较
- tab标签(选项卡)切换实现
- DataSnap之000