C++对象模型(一)

在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  内存布局
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值