第1章 关于对象
1.1 c++对象模式
c++中有两种class data members: static和nonstatic,三种class member functions: 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;
};
简单对象模型
简单模型中,一个object是一系列的slots,每一个slot指向一个members。Members按其声明顺序,指被指定一个slot。每一个data member或function member都有自己的一个slot。模型如图1.1所示
简单模型中,member本身并不放在object中。只有指向member的指针才放在object内。原因是可以避免‘members有不同的类型,因而需要不同的存储空间’所带来的问题。Object中的member是通过slot的索引来寻址的。一个class的大小是‘指针大小乘以class中声明的members个数’
表格驱动对象模型
为了对所有classes的所有objects都有一致的表达方式,引入表格驱动对象模型。它把所有与members相关的信息放在data member table(存放数据本身)和member function table(存放指向member function的slot指针)中,class object本身内含指向这两个table的指针。如图1.2所示
c++对象模型
member | class object外 |
---|---|
Non static data members | class object内 |
static data members | class object外 |
static和non static function members | class object外 |
virtual function | 两个步骤1.每个class产生一堆指向virtual function的指针,放在表格中,这个表格被称为virtual table(vtbl) 2.每个class object有一个指向virtual table的指针,被称为vptr。 |
如上图所示,这个模型的主要优点是空间和存取效率。主要缺点是如果应用程序代码本身未曾改变,但所用到的class objects的non static data members有所修改,应用程序需要重新编译。
继承
c++支持单一继承
class Library_materials{......};
class Book:public Library_materials{......};
class Rental_book:public Book{......}
c++也支持多重继承
class iostream: public istream, public ostream{......};
继承关系也可以指定为虚拟
class istream:virtual public ios{...};
class ostream:virtual public ios{...};