面向对象的三大特性,封装、继承、多态。从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放入虚表中