派生类构造函数形式:
派生类构造函数 (参数表):基类构造函数(参数表)
类对象成员1(参数表)... 类对象成员n(参数表)//只能用表达式的方式对类对象成员进行初始化
{...派生类自定义的数据成员初始化}
在派生类中,首先调用基类的构造函数,其次调用对象成员所属类的构造函数,最后调用派生类自己的构造函数,析构函数调用顺序与上述相反。
下面来看一段代码:
#include <iostream>
using namespace std;
class Num
{
private:
float n;
public:
Num(float x)
{
n = x;
cout<<"I'm a son."<<endl;
}
};
class Father
{
protected:
int a,b;
public:
Father(int x,int y)
{a = x;b = y;}
//Father(){}
ShouValue()
{
cout<<a<<" "<<b<<endl;
}
};
class Son : public Father
{
private:
Num nu;
int c,d;
public:
Son(int w,int x,int y,int z,int zz):Father(w,x),
nu(zz)
{a = w;b = x;c = y;d = z;}
ShouValue()
{
cout<<c<<" "<<d<<endl;
}
};
int main(void)
{
Father v1(1,2);
Son v2(3,4,5,6,7);
v1 = v2;
v1.ShouValue();
v2.ShouValue();
v2.Father::ShouValue();
return 0;
}
分析:Son是基类Father的单继承派生类,Num是Son的一个子类(相对于组合类而言),从上述代码可以看出,继承与组合有相似的地方,Son继承了Father,所以Son中具有Father的数据成员a,b,同时Num与Son组合,那么Son中就具有了Num中的float e这个数据成员,所以初始化的时候有相似的地方,都是使用表达式初始化。
上述代码中Son的构造函数为:
Son(int w,int x,int y,int z,int zz):Father(w,x),nu(zz)
{c = y;d = z;}
我们还可以写为:
Son(int w,int x,int y,int z,int zz):,nu(zz)
{a = w;b = x;c = y;d = z;}
但是这个时候就要在Father中添加一个无形参的构造函数Father(){},因为在Son的构造函数中把基类的构造函数省略了。