关于对象
1.C++对象模式
类成员
- 两种类数据成员(class data member):static 和 nonstatic;
- 三种类成员函数(class member function):static、nonstatic 和 virtual;
对象模型
- 简单对象模型:一个对象是一个slots(表格中的一条),一个slot对应一个成员(数据或者函数),成员(members)本身不放在对象(objective)中,对象只存放指向成员的指针;存在基类时,基类在派生类中由一个solt指向。(没有被用到编译器上)
- 表格驱动对象模型:分为数据成员表(data member table)和函数成员表(member function table)两个部分,类对象包含指向这两个表格的指针,函数成员表是一系列slots,每一个slot为一个指向成员函数的指针,数据成员表就是数据本身;存在基类时,加上一个基类表,类对象含有一个指针指向基类表;(没有被用到编译器上)
- C++对象模型:
1)Nonstatic data members放在每一个类对象中,static data members放在个别类对象外;
2)static 和 nonstatic function members放在个别类对象外;
3)虚函数以一下两个方法支持:(1)每一个类产出一堆指向虚函数的指针,放在表格中,称为虚函数表(virtual table);(2)每个类对象安排一个指针指向虚函数表,称为vptr
4)存在基类时,一开始将基类数据对象直接放在派生类对象中;加入虚基类时,派生类对象为每个虚基类加上一个指向其的指针对象;
2.关键词带来的差异
struct和class在定义类对象的想相同的,均可以定义private、public、protected,但是如果要用于模板类或模板函数,只能用class;struct能保证数据成员的空间布局,而class则不一定。
3.对象的差异
C++支持多态的方法:
- 由隐式转换操作,把一个派生类指针转化为一个公有基类的指针
class shape
{
public:
...
private:
int a;
};
class circle : public shape
{
public:
...
private:
int b;
};
shape *ps=new circle();
- 由虚函数机制(virtual function):根据指针和引用指向的对象来判断所调用的函数是派生类还是基类的同名函数;基类指针可以指向派生类,但是基类指针和引用只能够指向其基类的成员;将一个基类对象初始化为一个派生类对象时会发生切割,即为了将一个较大的对象塞入到一个较小的对象中,将不含有派生类的特有成员,多态也不在呈现。
ps->rotate;
- 由dynamic_cast和typeid运算符:
if(circle *pc=dynamic_cast< circle* >(ps));