单继承派生类只有一个基类或虚基类,根据4个优先级别容易确定构造顺序:
首先调用派生类虚基类的构造函数;无论虚基类的构造函数列出否总会被执行; 
接着调用派生类基类的构造函数,无论基类的构造函数列出与否总会被执行;
然后按照派生类数据成员声明的顺序,依次初始化数据成员或调用相应构造函数,对象成员无论列出与否总会被构造;
在然后最后执行派生类的构造函数体。

析构是构造的逆序,所以反过来就行。

   

#include <iostream.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
class A{
    int  a;
public:
    A (  ):a (8)
    { cout<<a; } //非const成员a,可在函数体内再次对a赋值
    A (int  x):a (x)
    { cout<<a;  }
    ~A ( ) { cout<<a;  }
};
class B:A{ //私有继承,等价于class B: private A{
    int   b, c;
    const  int  d;  //B定义有只读成员d, 故B必须定义构造函数
    A   x,  y,z;
public://按声明顺序初始化A、b、c、d、x、y、z。A、z可不列出
    B (int v) :b (v),  y (b+2),  x (b+1),  d (b),  A (v) {
        c=v;     cout<<b<<c<<d;   cout<<"C";    //b,  c可再次赋值
    }
    ~B ( )   { cout<<"D";  }
};
void main (void)
{
  B   z(1)  ;
  //system("pause");
 //return 0;
 }

 

  构造时:

  首先输出  1,调用有参构造函数,构造A(v)//首先构造基类

构造数据成员  b c  不输出

           构造  x y  调用有参构造函数  输出  2 3

           构造   z    调用无参构造函数  输出  8

           输出   cout那一句  1 1  1 分别是b c d 

           输出   C

           输出   D  析构了 b c  d

           输出   8 3 2 1 析构了  z  y  x  和基类

           析构和构造正好是逆序。

           

           

posted on 2012-12-19 17:30  一把刷子  阅读(915)  评论(0编辑  收藏  举报