派生类的构造函数

默认情况下基类的构造函数不被继承,派生类需要定义自己的构造函数,但是C++11规定:可用using语句继承基类构造函数,只不过只能初始化从基类继承的成员。派生类新增成员可以通过类内初始值进行初始化。语法形式为: using B::B;

综上所述在一般编写程序时建议:
如果派生类有自己新增的成员,且需要通过构造函数初始化,则派生类要自定义构造函数。

若不继承基类的构造函数
派生类新增成员:派生类定义构造函数初始化;
继承来的成员:自动调用基类构造函数进行初始化;
派生类的构造函数需要给基类的构造函数传递参数。

单继承
派生类只有一个直接基类的情况,是单继承。单继承时,派生类的构造函数只需要给一个直接基类构造函数传递参数。
单继承时构造函数的定义语法:
派生类名::派生类名(基类所需的形参,本类成员所需的形参):
基类名(参数表), 本类成员初始化列表
{
//其他初始化;
};

多继承
多继承时,有多个直接基类,如果不继承基类的构造函数,派生类构造函数需要给所有基类构造函数传递参数。我们来看一下语法规定:

派生类名::派生类名(参数表) :
基类名1(基类1初始化参数表),
基类名2(基类2初始化参数表),

基类名n(基类n初始化参数表),
本类成员初始化列表
{
//其他初始化;
};

派生类与基类的构造函数
当基类有默认构造函数时:
派生类构造函数可以不向基类构造函数传递参数。
构造派生类的对象时,基类的默认构造函数将被调用。
如需执行基类中带参数的构造函数:
派生类构造函数应为基类构造函数提供参数。

多继承且有对象成员
派生类名::派生类名(形参表):
基类名1(参数), 基类名2(参数), …, 基类名n(参数),
本类成员(含对象成员)初始化列表
{
//其他初始化
};

构造函数的执行顺序
1)调用基类构造函数。
顺序按照它们被继承时声明的顺序(从左向右)。
2)对初始化列表中的成员进行初始化。
顺序按照它们在类中定义的顺序。
对象成员初始化时自动调用其所属类的构造函数。由初始化列表提供参数。
3)执行派生类的构造函数体中的内容。

访问从基类继承的成员
1)当派生类与基类中有相同成员时:
若未特别限定,则通过派生类对象使用的是派生类中的同名成员。
如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名和作用域操作符(::)来限定。
2)二义性问题:
如果从不同基类继承了同名成员,但是在派生类中没有定义同名成员,“派生类对象名或引用名.成员名”、“派生类指针->成员名”访问成员存在二义性问题。
解决方式:用类名限定。

猜你喜欢

转载自blog.csdn.net/weixin_42325069/article/details/84106647