第十三章 类继承(2)一个简单的基类和派生

(二)一个简单的基类和派生类

1.基础概念:

从一个类派生出另一个类时,原始类叫作基类,派生出来的类叫作派生类。类的构造函数可以使用成员初始化列表语法,这样可以在运行构造函数体之前就将类的成员进行初始化,使用的参数就是我们建立对象的参数。

这样做有时候可以节省资源,比如我们的类成员中有一个类对象(以类的对象作为自己的数据成员),则使用初始化列表直接用参数来调用对象的复制构造函数初始化对象,而如果不用初始化列表,那么这个对象将会在构造函数体内通过复制构造函数和赋值运算符两步对数据成员初始化,需要额外的空间和时间。而且,在后面可以看到,派生类对基类的初始化只能通过成员初始化列表的语法。

2.派生类(公有派生)

(1)声明的格式

如:class RatedPlayer: public TableTennisPlayer {};

(2)格式说明

“:”表示RatedPlayer类的基类是TableTennisPlayer。Public表示是公有派生,使用公有派生表明,基类的公有部分将是派生类的公有部分基类的私有部分也将是派生类的一部分,或者说派生类对象包含基类对象,但只能通过基类的公有方法和保护方法来进行访问。这说明,基类的私有部分,即使在派生类中也是不可见的。

派生类不能直接访问基类的私有成员,必须通过基类的方法进行访问,这也说明派生类构造函数必须使用基类的构造函数。

派生类可以调用基类的构造函数来生成基类部分,也就是使用基类的类名加上相应的参数。那么如果省略了这个构造函数呢?实际上,派生类会使用基类的默认构造函数来生成对象,因此,除非要使用默认构造函数,否则应该显式调用正确的构造函数。

(3)派生类中创建对象的顺序

首先创建基类对象,通过初始化列表将基类信息传递给基类的构造函数(派生类构造函数一定会首先调用基类构造函数,因此基类构造函数应该在初始化列表的最开始;如果我们不指定,则会调用基类的默认构造函数),之后,派生类初始化派生类的相应类成员。对象释放时候的顺序正好相反,首先调用的是派生类的析构函数,也就是释放派生类的相应数据成员,然后自动调用基类的析构函数

(4)需要在派生类中添加什么呢?

派生类需要有自己的构造函数;派生类还可以按需要添加额外的数据成员和成员函数

注意:派生类中的构造函数的参数依然要包含所有的基类的构造函数需要的参数,因为基类是需要这些参数来构建派生类中的属于基类的部分(也可以这么说,派生类对象中包含着基类的对象);另一种方法是将一个基类的对象作为参数传递给派生类,然后用这个对象作为参数构建派生类的基类部分。

(5)基类对象初始化:

基类对象应该在序进入派生类构造函数之前创建,因此可以用成员初始化列表来对基类对象进行初始化成员初始化列表只能用于构造函数。也就是派生类对象中实际是包含着基类对象的,基类对象即使是在派生类对象中也是处于封装状态的。

如果不调用基类构造函数(也就是成员初始化列表那里没有初始化基类对象),程序将使用默认的基类构造函数(也就是不加参数的c++自己设定的构造函数)除非使用默认的构造函数否则应该显式地调用正确的基类构造函数

(6)派生类构造函数的要点:

创建对象的顺序:

首先创建基类对象;然后派生类构造函数应该通过成员初始化列表基类信息传递给基类构造函数;派生类构造函数应该初始化派生类新增的数据成员。

释放对象的顺序:

应该与创建对象的顺序相反,即先调用派生类的析构函数,再调用基类的析构函数。调用基类的析构函数是自动的,因此派生类的析构函数只处理好派生类中相应的数据成员的回收工作就可以了,不用显式调用基类的析构函数。

第十三章 类继承(2)一个简单的基类和派生_第1张图片

你可能感兴趣的:(第十三章 类继承(2)一个简单的基类和派生)