单继承派生类只有一个基类或虚基类,根据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 和基类
析构和构造正好是逆序。