派生类不能直接访问基类的私有成员,必须使用基类的公有方法来访问基类的私有成员。这意味着派生类的构造函数必须使用基类的构造函数来设置从基类中继承的私有成员。
因此,在程序使用派生类构造函数创建派生类对象之前,要使用基类构造函数创建基类对象。C++中,使用成员初始化列表完成这种工作。
示例:
class A
{
public:
A(int a);
A();//默认构造函数
private:
int a_;
};
class B: public A
{
public:
B(int b, int a);
B();//默认构造函数
private:
int b_;
};
A::A(int a) //A的构造函数
{
a_=a;
}
B::B(int b,int a):A(a) //B的构造函数,使用成员初始化列表创建A,B中的变量b_也可以采用成员初始化列表初始化,如
{ // b_(b)
b_=b;
}
假设主程序中包含如下语句:
B test(1,2);// 定义了一个变量名为test的B类变量,并初始化
B的构造函数首先将实参1,2赋给形参b,a,然后将a作为实参传递给构造函数A(int a),并创建一个嵌套的A类的对象,将2赋给a_保存到该对象中,然后进入B的构造函数体,完成B类对象的创建,并将参数值1赋给b_。
注:
1. 如果派生类构造函数省略成员初始化列表,程序将默认使用基类的默认构造函数,除非要是使用默认构造函数,否则应显式调用正确的基类构造函数。
示例:
B::B(int b,int a) // :A()默认的基类构造函数
{
b_=b;
}
2. 派生类构造函数中,也可以调用基类的复制构造函数
示例:
B::B(int b,A a) :A(a) // :如果没有定义A类显示构造函数的话,则A(a)将调用A类的隐式复制构造函数
{
b_=b;
}
3. 派生类在过期时,程序将首先调用派生类析构函数,然后再调用基类的析构函数。