首先,应知道这一点:派生类不能直接访问基类的私有成员,必须通过基类的方法进行访问。
然而,派生类却从基类那里继承了基类的私有成员,这就导致,派生类的构造函数不能用一般类型的构造函数。这时候,可以用初始化列表:
Ratedplayer::Ratedplayer(unsigned int r,const string &fn,const string &ln,bool ht):TableTennisPlayer(fn,ln,ht)
{
rating=r;
}
其中,TableTennisPlayer(fn,ln,ht)是初始化列表,他是可执行代码,调用TableTennisPlayer构造函数。这样,就避免了派生类不能访问基类私有成员的问题,另外,也可以使用这样的成员列表:
Ratedplayer::Ratedplayer(unsigned int r,const TableTennisPlayer &tp):TableTennisPlayer(tp)
{
rating=r;
}
这里也将TableTennisPlayer的信息传递给了TableTennisPlayer构造函数:
TableTennisPlayer(tp)
由于tp的类型为TableTennisPlayer &,因此将调用基类的复制构造函数。基类没有定义复制构造函数,编译器将自定生成一个默认的复制构造函数,由于这个类没有使用动态内存分配,所以可以使用默认的复制构造函数。
如果省略成员初始化列表,
Ratedplayer::Ratedplayer(unsigned int r,const string &fn,const string &ln,bool ht)
{
rating=r;
}
由于,必须首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数,因此,上述代码,与下面的等价:
Ratedplayer::Ratedplayer(unsigned int r,const string &fn,const string &ln,bool ht):TableTennisPlayer()
{
rating=r;
}
除非要使用默认的构造函数,否则应显式调用正确的基类构造函数。
有关派生类构造函数的要点如下:1)首先创建基类对象。
2)派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数。
3)派生类构造函数应初始化派生类新增的数据成员。