c++对象学习笔记(1)

来源:互联网 发布:淘宝查号kehuda 编辑:程序博客网 时间:2024/05/02 00:22

       面向对象的三大特性,封装、继承、多态。从C语言到C++的转变首先接触的是类和对象。C++对数据的封装不会增加成本。C++在布局和存取时间上的额外负担是在使用virtual机制的时候引起的。一般情况下和C语言的结构体无二。

 

     C++ virtual机制包括:

 

1.虚函数机制:支持执行期绑定

2.虚基类:多重继承,只存在一个被共享的虚基类。

 

 

一. C++的对象模型在机器中的摆放

 

C++中有两种成员变量:静态成员变量和非静态成员变量

有3中成员函数:静态成员函数和非静态成员函数,virtual函数

 

1.最简单的模型

 

成员本身不放入对象中去,而是将指向成员的指针放入对象中。

 

对象按照成员的声明顺序依次存放指向成员的指针(在书中称之为slot)。

 

每个成员函数或者成员变量都有自己的slot ,成员是根据slot的索引(次序)来寻址的

 

对于父类的处理是:存放指向 基类subobj的地址。

 

2. 表格驱动对象模型

分别将成员变量和成员函数放到两个不同的表中。而对象只是存放指向这两个表的指针

 

成员变量表:存放变量本身

成员函数表:存放指向成员函数的slot(和简单模型中的存放方式一样)【这个表格后来演化出了虚表】

 

 

3.C++对象模型

只是将非静态成员(nonstatic member)放在对象中。而静态成员函数,静态成员变量,和非静态的成员函数都在对象之外。

 

对于虚函数的处理:

(1)class有个虚表,它保存了所有指向虚函数的指针

(2)对象保存虚指针,用来指向虚表。由构造函数,析构函数,拷贝函数来设定虚表。

 

所以,C++对象模型中 ,对象存有两种东西:1 非静态成员变量 2 指向虚表的虚指针

 

虚表也存有两种东西:1 RIIT时用的类型信息  2  指向虚函数的指针

 

C++所采用的继承模型

 

基类对象的成员变量直接存放在子类对象中。

 

对于虚基类1 为每个有关联的虚基类加上指针 2 虚基类表 3放入虚表中