C++对象模型
2013-05-17 20:14
253 查看
一、C++对象模型
C++对象模型包括两个层次:
1. 语言层面:语言总直接支持面向对象程序设计的部分;
2. 编译器层面:对于各种支持的底层实现机制。
C++对象模型的“不变量”,是指对象模型是在编译时期确定的,没有办法在执行期动态增加或修改。
二、对象模型概览
1. C++对象模型组成
(1)数据:static和nonstatic
(2)函数:static\、nonstatic、virtual
(3)继承:单继承、多继承和虚拟继承
2. 简单对象模型
对象由slots组成,每个slot指向一个数据成员或成员函数。基类作为一个数据成员,也占有一个slot。
优点:避免成员数据类型造成的对象大小不同,
缺点:占用新的空间,间接性导致存取时间增加。
3. 表格驱动模型
对象采用成员函数表和数据成员表组成。每个表包含多个slots,指向成员数据或者成员函数。
4. C++对象模型
(1)nonstatic成员数据保存在每个class object内部;
(2)static成员数据保存在所有的class object对象之外;
(3)static和nonstatic成员函数则放在所有的class object对象之外;
(4)virtual成员函数则采用间接访问:
a.每个class产生一堆指向virtual成员函数的指针,放在表格中,称为virtual table;
b.每个class object添加一个指针,指向,称为vptr。
c.vptr的设定和重置都是由class的构造函数、析构函数和复制赋值运算符来完成。
d.每个class所关联的类型信息也是保存在virtual table中,通常放在表格的第一个slot中。
(5)virtual base class采用virtual base table或通过扩充virtual table来维护每一个virtual base table的位置。
5.对象模型差异
(1)过程模型procedural model:分离的数据和函数,函数只是用来处理数据;
(2)抽象数据类型模型abstract data type model:采用一组公开接口表达抽象;
(3)面向对象模型object-oriented model:通过抽象的基类封装相关的类型,提供共通的接口。
a.面向对象程序员需要处理的是一个未知对象,但是该对象的类型受限于其继承体系;
b.面向对象通过指针和引用操作类对象,继承层次间的赋值操作会导致对象信息损失;
c.ADT编程范型中的对象是一个拥有固定而单一类型的实体,在编译期已经确定;
d.面向对象通过public class组织类型,并利用指针和引用操作类对象实现多态,C++的多态通过如下方式实现:
i.把派生类指针转化为基类指针;
ii.经由虚函数机制调用接口;
iii.把派生类指针转化为基类指针;
a.面向对象通过指针和引用操作类对象,
C++对象模型包括两个层次:
1. 语言层面:语言总直接支持面向对象程序设计的部分;
2. 编译器层面:对于各种支持的底层实现机制。
C++对象模型的“不变量”,是指对象模型是在编译时期确定的,没有办法在执行期动态增加或修改。
二、对象模型概览
1. C++对象模型组成
(1)数据:static和nonstatic
(2)函数:static\、nonstatic、virtual
(3)继承:单继承、多继承和虚拟继承
2. 简单对象模型
对象由slots组成,每个slot指向一个数据成员或成员函数。基类作为一个数据成员,也占有一个slot。
优点:避免成员数据类型造成的对象大小不同,
缺点:占用新的空间,间接性导致存取时间增加。
3. 表格驱动模型
对象采用成员函数表和数据成员表组成。每个表包含多个slots,指向成员数据或者成员函数。
4. C++对象模型
(1)nonstatic成员数据保存在每个class object内部;
(2)static成员数据保存在所有的class object对象之外;
(3)static和nonstatic成员函数则放在所有的class object对象之外;
(4)virtual成员函数则采用间接访问:
a.每个class产生一堆指向virtual成员函数的指针,放在表格中,称为virtual table;
b.每个class object添加一个指针,指向,称为vptr。
c.vptr的设定和重置都是由class的构造函数、析构函数和复制赋值运算符来完成。
d.每个class所关联的类型信息也是保存在virtual table中,通常放在表格的第一个slot中。
(5)virtual base class采用virtual base table或通过扩充virtual table来维护每一个virtual base table的位置。
5.对象模型差异
(1)过程模型procedural model:分离的数据和函数,函数只是用来处理数据;
(2)抽象数据类型模型abstract data type model:采用一组公开接口表达抽象;
(3)面向对象模型object-oriented model:通过抽象的基类封装相关的类型,提供共通的接口。
a.面向对象程序员需要处理的是一个未知对象,但是该对象的类型受限于其继承体系;
b.面向对象通过指针和引用操作类对象,继承层次间的赋值操作会导致对象信息损失;
c.ADT编程范型中的对象是一个拥有固定而单一类型的实体,在编译期已经确定;
d.面向对象通过public class组织类型,并利用指针和引用操作类对象实现多态,C++的多态通过如下方式实现:
i.把派生类指针转化为基类指针;
ii.经由虚函数机制调用接口;
iii.把派生类指针转化为基类指针;
a.面向对象通过指针和引用操作类对象,
相关文章推荐
- C++对象模型(四):class成员初始化列表(Member Initialization List)
- c++对象模型研究2:构造函数
- c++对象内存模型【内存布局】
- 关于C++对象模型的思考
- C++对象模型(一)
- C++对象模型之拷贝构造函数
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图 .
- C++对象模型——Data 语意学(第三章)
- c++对象模型研究3:数据
- 【对象模型】C++模版的编译链接过程——编译器真的会检查所有tocken层面的错误么?
- C++对象模型学习——执行期语意学
- 对象(深入C++对象模型)
- 详细介绍c++中的类对象内存模型
- C++对象模型解析
- 深入探索C++对象模型之六 --- 执行期语意学
- C++对象模型
- c++对象模型 布局
- C++对象模型——Default Constructor的建构操作(第二章)
- C++对象模型(3)
- 读【深度探索C++对象模型】【下】