:
为什么使用继承
所谓继承就是从先辈处得到属性和行为特征。类的继承就是新的类从已有类那里得到已有特征。这样做的目的是:减少代码的重复。
派生类的声明
声明派生类的一般公式 :
class 派生类名:[继承方式] 基类名
{
派生类新增的数据成员和成员函数;
}
“基类名”是已经声明的类的名称,“派生类名”是继承原有类的特征而生成的新类的名称。
继承方式有三种:
如果不显示地给出继承方式关键字,系统默认为私有继承(private)。类的继承方式指定了派生类成员以及类对象对于从基类继承来的成员的访问权限。
派生类的构成
1)派生类从基类接受成员
在C++类的继承中,派生类把基类的全部成员(除构造函数和析构函数之外)接收过来。
2)派生类不能对接受基类的成员进行选择,但是可以对这些成员进行某些调整。
调整包括两个方面:
一.一方面是改变基类成员在派生类中的访问属性,这主要是通过派生类声明时的继承方式来控制的。
二.另一方面是派生类可以对基类的成员进行重定义,即在派生类中声明一个与基类成员同名的成员,则派生类中的新成员会覆盖基类的同名成员,这时在派生类中或通过派生类对象,直接使用成员名就只能访问到派生类声明的同名成员。重定义也支持重载。
3)在派生类中增加新的成员。
在派生类中增加新的成员体现了派生类对基类功能的扩展,是继承和派生机制的核心。
由于在继承过程中,基类的构造函数和析构函数是不能被继承的,因此在声明派生类时,一般需要在派生类中定义新的构造函数和析构函数。
基类成员在派生类中的访问属性
派生类可以继承基类中除了构造函数与析构函数之外的成员,但是这些成员的访问属性在派生过程中是可以调整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。
类的继承方式有三种,公有,私有,保护。
1)基类中的私有成员。
无论哪种继承方式,基类中的私有成员不允许派生类继承,即在派生类中是不可直接访问的。
2)基类中的公有成员。
当继承方式为公有(public)继承时,基类中的所有公有成员在派生类中仍以公有成员的身份出现。
当继承方式为私有(private)继承时,基类中的所有公有成员在派生类中都以私有成员的身份出现。
当继承方式为保护(protected)继承时,基类中所有公有成员在派生类中都以保护成员的身份出现。
3)基类中的保护成员。
当继承方式为公有继承时,基类中所有保护成员在派生类中仍以保护成员的身份出现。
当继承方式为私有继承时,基类中所有保护成员在派生类中以私有成员的身份出现。
当继承方式为保护继承时,基类中所有保护成员在派生类中仍以保护成员的身份出现。
所以我们声明派生类的继承方式,一般为公有继承,公有继承不改变基类成员在派生类中的访问属性。
派生类对基类成员的访问规则
派生类对基类成员的访问形式主要有以下两种:
1)内部访问。由派生类中新增的成员函数对基类继承来成员访问。
2)对象访问。在派生类外部,通过派生类的对象对从基类继承来的成员的访问。
一、私有继承的访问规则
经过了私有继承之后,所有基类的成员都成为了派生类的私有成员或者不可访问成员,如果进一步派生的话,基类的全部成员都无法在新的派生类中被访问。因此,私有继承之后,基类的成员无法在以后的派生类中再发挥作用,实际是中止基类在之后继续派生,这种情况比较少。
二、公有继承的访问规则
当类继承方式为公有继承时,基类的公有成员被继承到派生类仍作为公有成员,派生类的公有成员可以直接访问它们,在类的外部,可以通过派生类的对象访问。
公有继承时,基类的保护成员被继承到派生类中,仍未保护成员,可以在类内通过成员函数访问,派生类的派生类也可以访问它,可以继续派生,但是我们派生类的对象不能直接访问基类中继承的保护成员,因为保护成员只能由类内和派生类访问。
公有继承时,基类的私有成员不允许派生类继承,无论是派生类的成员函数还是派生类的对象都不能直接访问到基类的私有成员。
强调:
不要以为公有继承就能访问到基类的私有成员了。私有成员是不能被继承到的。
保护继承的访问规则
当类的继承方式为保护继承时,基类的公有成员和保护成员被继承到派生类中都是保护成员,派生类的其他成员可以访问它们,但是派生类的对象,不能直接在类外访问保护成员。基类的私有不允许被继承,在保护继承方式中也一样。