一、C++对象模型
在c++中,class data members有两种:static、nonstatic;class member function有三种:static 、nonstatic、virtual;
例如:下面这个class Point
class Point
{
public:
Point(float xval);
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print(ostream &os) const;
float _x;
static int _point_count;
};
如果有 Point pt;那么这个对象的模型怎样表现呢?
1、对于nonstatic data members被配置于每一个 class object之内;
2、对于static data members则存放于个别的class object之外;
3、static 和nonstatic function members也被放在个别的class object之外;
4、对于virtual function:
(1) 每个class产生出一堆指向virtual function 的指针,放在表格中,这个表格被称为virtual table(vtbl);
(2) 每个class object被安插一个指针,指向相关的virtual table;即vptr;
二、C++支持多态的方法
1、一组隐式的转化操作
把派生类指针转化为一个指向其public base type 的指针
shape *ps = new circle();
2、由virtual function机制
ps->rotate();
3、经由dynamic_cast和typeid运算符:
if(circle *pc = dynamic_cast<circle *> (ps) )
三、C++对象布局
class ZooAnimal
{
public:
ZooAnimal();
virtual ~ZooAnimal();
//...
virtual void rotate();
protected:
int loc;
String name;
};
当有如下:
ZooAnimal za("Zoey");
ZooAnimal *pza = &za;
内存布局为:
可以看出占用的内存为4+8+4=16byte;
加上多态之后:
class Bear :public ZooAnimal
{
public:
Bear();
~Bear();
//...
void rotate();
virtual void dance();
//...
protected:
enum Dances{...};
Dances dances_known;
int cell_block;
};
Bear b("Yogi");
Bear *pb = &b;
Bear &rb = *pb;
内存布局为: