打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
深度探索C++对象模型

一:C++对象模型(The C++ Object Model)

      1:不带继承的C++对象模型

      在C++中,有两种class data members: static 和 nonstatic,以及三种Class member functions : static,nonstatic和virtual。

      比如下面的class Point 声明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
};

      这个class Point 在机器中将会被怎么样的表现呢?我们的编译器如何模塑出各种data members 和 function members 呢?

      如上图,在C++模型中,Nonstatic data members 被配置于每一个class object 之内,static data members则被放置于所有的class object 之外,Static 和 nonstatic function members 也被放在所有的class object 之外。

      而对于Virtual functions ,首先每一个class 产生出一堆指向virtual functions 的指针,放在表格之中,这个表格被称之为virtual table;然后,每一个class object 被添加了一个指向这个virtual functions表格的指针。而在运行时候表现出来的多态也是由这个virtual functions的指针支持,在随后的笔记中我们会讲到。

      2:加上继承(Adding  Inheritance)

      C++ 支持单继承和多继承。例如

         class Library_materials {...};

         class Book : public Library_materials {.....};

         class Rental_book :public Book {...};    ....单继承模型

         class iostream : 

      public istream,

                 public ostream{...};

          class istream :virtual pubulic ios {...};

          class ostream : virtual public ios {...};   ....多继承模型

      在虚拟继承中,base class 不论被继承串联中被派生多少次,永远只会存在一个实体,virtual 虚拟 即共享的意思。所有的派生类共享这一个base class 实体。

      多继承结构中,derived class 塑造base class 模型呢,他沿用的是对virtual functions 的方法,即每一个class object 内含有一个vptr(即志向 base class table的指针) 于是就有了下图:

          

二: 对象模型如何影响程序

       看下面的程序:其中class X定义了一个copy constructor,一个virtual destructor 和 一个virtual function foo:

X foobar()
{
    X xx;
    X *px = new X();
    //foo() 是一个virtual function
    xx.foo();
    px->foo();
    delete px;
    return xx;
}

       上面这个函数将被转换成如下的函数:

       

 1 void foobar(X &_result) 2 { 3     //构造 _result 4     //_result 来替换 local xx .... 5     _result.X::X(); 6  7     //扩展 X *px = new X() 8     px = _new(sizeof(X)); 9     if(px != 0)10         px->X::X();11 12     //扩展 xx.foo() 但是不使用virtual 机制13     // 以 _result 取代 xx14     foo( &_result);15 16     //使用virtual 机制扩展 px->foo()17     (*px->vtbl[2]) (px);18 19     //扩展 delete px20     if( px != 0)21     {22         ( *px->vtbl[1])(px);23         _delete (px);24     }25 26     return ;27 }

        这个扩展的函数中,使用vtbl 去扩展对virtual 函数的调用,可以让大家更明白virtual function table对程序产生的影响,参照这个模型的设计,我们也可以去扩展vptr(指向virtual base class的指针)。有兴趣的网友可以去扩展下。

      

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
c++对象模型读书笔记
C/C++ 经典问题 3
.NET中的虚函数
类大小sizeof(class)
自由而无用的uvm
Polymorphism in C++
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服