六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 67|回复: 0

继承体系下的对象构造与解构——《Inside The C++ Object Model》之三

[复制链接]

升级  88%

12

主题

12

主题

12

主题

童生

Rank: 1

积分
44
 楼主| 发表于 2013-1-27 05:22:11 | 显示全部楼层 |阅读模式
1 所有virtual base class constructor必须被调用,从左到右,从最深到最浅:

  • 如果class 被列于member initialization list中,那么如果有任何明确指定的参数,都应该传递过去,若没有列于list中,而class有一个default constructor,也应该调用之
  • 此外,class中的每一个virtual base class subobject 的偏移量(offset)必须在执行期可被存取
  • 如果class object是最底层(most-derived)的class,其constructor可能被调用;某些用以支持这个行为的机制必须被放进来
2 所有上一层的base class constructor必须被调用,以base class声明的顺序为序

  • 如果base class 被列于member initialization list中,那么任何明确指定的参数都应该传递过去
  • 如果base class 没有被列于member initialization list中,而它有default constructor(或有default memberwise copy constructor),那么就调用之
  • 如果base class 是多重继承体系下的第二或者后继的base class,那么this指针必须有所调整
3 如果class object有virtual table pointer(s),这些pointer(s)必须被设定初值,指向适当的virtual table(s)
4 记录在member initialization list中的data member初始化操作会被放进constructor中,并以members的声明顺序为顺序
5 如果有一个member没有出现在member initialization list中,但是它有一个default constructor,那么该default constructor被调用
 解构的顺序与构造顺序相反!
 以下是一个验证的例子
#include   <iostream>   using   namespace   std;   class Base{public:Base(){cout<<"Base ctor"<<endl;}~Base(){cout<<"Base dtor"<<endl;}};class B{public:B(){cout<<"B ctor"<<endl;}~B(){cout<<"B dtor"<<endl;}};class C:public virtual Base{public:C(){cout<<"C ctor"<<endl;}~C(){cout<<"C dtor"<<endl;}};class A{public:A(){cout<<"A ctor"<<endl;}~A(){cout<<"A dtor"<<endl;}};class X{public:X(){cout<<"X ctor"<<endl;}~X(){cout<<"X dtor"<<endl;}};class D:public A, public C,public virtual B{public:D(){cout<<"D ctor"<<endl<<endl;}~D(){cout<<"D dtor"<<endl;}virtual void fun(){}X x;};void  main(){   D d;}     VC6的输出结果如下:
Base ctorB ctorA ctorC ctorX ctorD ctorD dtorX dtorC dtorA dtorB dtorBase dtor 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表