在C++中,有两种类成员变量:static 和 nonstatic ;三种类成员函数: static 、nonstatic 和 virtual ;
如:
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;
};
简单对象模型:
图1:简单对象模型
在这个模型中,一个object是一些列的slots,每一个slot指向一个成员,成员按其声明次序,各被指定一个slot;
成员并不放在object中,只有指向成员的指针才放在object中,这样可以避免不同类型的成员需要不同的存储空间;
一个object大小计算:指针大小,乘以class中所声明的成员数目。
表格驱动对象模型:
图2 成员表对象模型
C++对象模型:
图3 C++对象模型
优点:空间和存取时间的效率;
缺点:修改非静态成员时,程序代码需重新编译;
对象的差异:
Library_materials thing1;
Book book;
//book被切割了
thing1=book;
//调用的是 Library_materials::check_in()
thing1.check_in();
Library_materials &thing2=book;
// 现在引发的是 Book::check_in()
thing2.check_in();
虽然可以直接或者间接处理继承体系中的一个基类对象,但只有通过 指针或者 引用的间接处理,才支持OO程序设计所需的多态性质;
C++以下列方法支持多态:
1、经由一组隐含的转化操作;如 将一个派生类指针转化为一个指向其基类的指针:shape *ps= new circle();
2、经由virtual function 机制:ps->rotate();
3、经由dynamic_cast 和 typeid 运算符:if( circle *pc = dynamic_cast< circle* >( ps ) )
一个类对象需要的内存空间:
1、非静态成员变量的总和大小;
2、加上任何由字节对齐的需求而填补上去的空间;
3、加上为了支持virtual 而由内部产生的额外负担。
class ZooAnimal
{
public:
ZooAnimal();
virtual ~ZooAnimal();
//...
virtual void rotate();
protected:
int loc;
String name;
};
class Bear:public ZooAnimal
{
public:
Bear();
~Bear();
//...
void rotate();
virtual void dance();
protected:
enum Dances{...};
Dances dances_known;
int cell_block;
};
Bear b("Yogi");
ZooAnimal*pz=&b;
Bear *pb=&b;
它们每个都指向 Bear object 的第一个字节,但 pb 所涵盖的地址包含整个 Bear object;而 pz 所涵盖的地址只包含 Bear object 中的 ZooAnimal subobject.
图4 内存布局