C++中,继承就是在一个已存在的类的基础上建立一个新的类。已存在的类称为基类,又称父类;新建立类称为派生类,又称为子类。
基类是对派生类的抽象,派生类是对基类的具体化。
(一)派生类的定义与构成
1)派生类的定义
class 派生类名:类派生列表{
成员列表
};
2)派生类的构成
派生类由两部分组成:第一部分是从基类继承得到的,另一部分是自己定义的新成员,这些成员仍然分为三种访问属性。
注意,友元关系是不能继承的:一方面,基类的友元对派生类成员没有特殊的访问权限;另一方面,如果基类被授予了友元关系,则只有基类有特殊访问权限,该基类的派生类不能访问授予友元关系的类。
实际编程中,设计一个派生类包括三个方面工作:
a)从基类接收成员。
除了构造函数与析构函数之外,派生类会把基类的全部成员继承过来。
b)调整基类成员的访问。
程序员可以对接收的成员指定访问策略。
c)在定义派生类时增加新的成员。另外还应该自己定义派生类的构造函数和析构函数,因为它们不能从基类继承过来。
(二)派生类成员的访问
不同的继承方式决定了基类成员在派生类中的访问属性
1)公有继承
基类的公有成员和保护成员在派生类中保持原有访问属性,私有成员仍为基类所有。
2)私有继承
基类的所有成员在继承类中为私有成员。
3)保护继承
一般地,保护继承与私有继承在实际编程中极少使用,它们只在技术理论上有意义。
在公有继承中,派生类成员可以访问继承的基类的public部分与protected部分,但是不能访问private部分。只有基类成员以及基类的友元可以访问private部分。
无论采用何种继承方式得到的派生类,派生类成员及其友元都不能访问基类的私有成员。
(三)赋值兼容性规则
赋值兼容规则是指在需要基类对象的任何地方,都可以使用共有派生类的对象来替代。通过公有继承,派生类得到了基类中除了构造函数与析构函数之外的所有成员。这样共有派生类实际就具有了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。
class Base{}; //基类
class Derive:public Base{}; //公有派生类
Base b,*pb; //定义基类对象,指针
Derive d; //定义派生类对象
赋值兼容性规则中所指的替代包括如下情况。
(1)派生类的对象可以赋值给基类对象;
b=d; //派生类对象赋值给基类,复制基类继承部分
(2)派生类的对象可以初始化基类的引用;
Base &rb=d; //基类引用到派生类对象
(3)派生类对象的地址可以赋值给指向基类的指针。
pb=&d; //基类指针指向派生类对象
(四)多重继承
C++支持一个派生类同时继承多个基类。
多重继承派生类的定义:
class 派生类名:访问标号1 基类名1,访问标号2 基类名2,...{
多重继承时,多个基类可能会出现同名的成员。在派生类中对这种基类对象的直接访问会有二义性。C++要求派生类对基类成员的访问必须是无二义性的。这时我们需要使用成员名限定消除二义性:
基类名::成员名 //在派生类内部使用基类成员,可以在fun()前面加上::,得到A::fun()
对象名.基类名::成员名 //派生类对象使用基类成员 ,c.A::fun(); c.B::fun();
对象指针名->基类名::成员名 //派生类指针使用基类成员, c1->A::fun(); c1->B::fun();