类的继承
继承与派生的概念
在C++中可重用性是通过继承这一机制来实现的,因此,继承是C++功能的一个重要组成部分。
在C++中,所谓继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为基类或父类,新建的类称为派生类或子类。
一个新类从已有的类那里获得其已有的特征,这种现象称为类的继承,从另一个角度来说,从已有的类产生一个新的子类,称为类的派生。
派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整,一个基类可以派生出多个派生类,每个派生类又可以作为基类再派生出新的派生类,因此,基类和派生类是相对而言的。
一个派生类只从一个基类派生,这称为但继承,这种继承关系所形成的层次是一个树形结构。
一个派生类不仅可以从一个基类派生,也可以从多个基类派生,也就是说,一个派生类可以有两个或多个基类。有两个或多个基类的称为多重继承。
派生类是基类的具体化,而基类是派生类的抽象
派生类的声明方式
声明派生类的一般形式为
class 派生类名:[继承方式] 基类名
{
派生类新增加的成员
};
继承方式包括public、private和protected,继承方式是可选的,如果不写,则默认为private。
派生类的构成
派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。从基类继承的成员体现了派生类从基类继承而获得的共性,而新增加的成员体现了派生类的个性。
实际上并不是把基类的成员和派生类自己增加的成员简单地加在一起就成为派生类,构造一个派生类包括三个部分:
1、从基类接收成员
2、调整从基类接收的成员
3、在声明派生类时增加的成员
此外,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的。
派生类成员的访问属性
继承方式为公用继承时,基类的公有成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。
继承方式为私有继承时,基类的公有成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有。
继承方式为受保护的继承时,基类的共有成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。
派生类的构造函数和析构函数
为解决在执行派生类的构造函数时,使派生类的数据成员和基类的数据成员同时都被初始化,则在执行派生类的构造函数时,调用基类的构造函数。
构造函数
定义派生类构造函数的一般形式为
派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数表){派生类中新增数据成员初始化语句}
执行派生类构造函数的顺序为
1、调用基类构造函数,对基类数据成员初始化
2、调用子对象构造函数,对子对象数据成员初始化
3、再执行派生类构造函数本身,对派生类数据成员初始化
析构函数
在派生类中可以根据需要定义自己的析构函数,用来对派生类中所增加的成员进行清理工作,基类的清理工作仍然由基类的析构函数负责,在执行派生类的析构函数时,系统会自动调用基类的析构函数和子对象的析构函数,对基类和子类进行清理。
调用析构函数的顺序为,先执行派生类自己的析构函数,对派生类新增加的成员进行清理,然后调用子对象的析构函数,对子对象进行清理,最后调用基类的析构函数,对基类进行清理。
多重继承
C++允许一个派生类同时继承多个基类,这种称为多重继承。
多重继承派生类的构造函数形式与单继承时的构造函数形式基本相同,只是在初始化表中包含多个基类构造函数。如
派生类构造函数名(总参数表):基类1构造函数(参数表),基类2构造函数(参数表),基类3构造函数(参数表列){派生类中新增数据成员初始化语句}
多个基类的排列顺序任意。
多重继承可以反映现实生活中的情况,能够有效地处理一些较复杂的问题,使编写程序具有灵活性,但是多重继承增加了程序的复杂度,使程序的编写和维护变得相对困难,容易出错。
C++提供虚基类的方法,使得在继承间接共同基类时只保留一份成员。
基类与派生类的转换
基类与派生类对象之间由赋值兼容关系,由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替,具体表现为:
1、派生类对象可以向基类对象赋值
2、派生类对象可以替代基类对象向基类对象的引用进行赋值或初始化。
3、如果函数的参数是基类对象或基类对象的引用,相应的实参可以用子类对象。
4、派生类对象的地址可以赋给指向基类对象的指针变量,也就是说,指向基类对象的指针变量也可以指向派生类对象。
继承与组合
在一个类中以另一个类的对象作为数据成员的,称为类的组合。
继承是纵向的,组合是横向的。

被折叠的 条评论
为什么被折叠?



