可重用性:即利用已经开发的软件资源进行软件开发,而不需要完全重新编码。
派生类是基类的具体化,基类是派生类的抽像。
单重继承:
多重继承:当新类型即是类型A、也是类型B、C时,可使用多继承。其带来的“歧义性”问题指的是当继承的多个类有同名的成员时,派生类在访问时将无法决定访问哪个成员,这时需要加成员限定符:基类名::成员名来解除歧义。
通过继承建立的基类与派生类的关系,是一种“是”的关系;而通过组合建立的成员类与组合类之间的关系,是一种“包含”的关系。
派生类在从基类继承时,做了如下调整:
派生类继承基类所有和数据成员和成员函数,不包含构造函数和析构函数,并可对成员作必要的增加和调整。有可能造成数据冗余,选取基类时,应注意使冗余最小。
调整从基类接收的成员:通过指定继承方式改变基类成员在派生类中的访问属性;声明与基类成员同名的成员,则将覆盖基类中的同名成员;如果是函数,则需要派生类和基类中的声明完全相同,否则成为“重载”。
在派生类中重新定义基类的成员运算符时,为完成某些附加的工作,派生类版本通常需要调用基类的函数版本,此时需要使用作用域运算符:基类名::成员名。
表格3.1 几种继承方式
基类成员访问说明符 | 继承类型 | ||
| PUBLIC(保留属性) | PROTECT[U1] | PRIVATE |
PUBLIC | Public | Protect | private |
PORTECT | Protect | Protect | private |
PRIVATE | 不可访问[U2] | 不可访问 | 不可访问[U3] |
保护继承:在多重继承中,可关闭部分权限(public->protect),但是又可在新的派生类中继续保留权限(protect->protect)。相对而言,public无法关闭权限,仅 保留权限;而private可关闭权限,但是多重继承后,后续的派生类将无法访问基类的公有和保护成员。
派生类不继承基类的构造函数和赋值运算符,但是派生类可调用这些函数。基类的成员的初始化由派生类构造函数隐式或显式(在构造函数中提供基类初始化值)调用基类构造函数。形式为:
派生类构造函数名(总参数列表) :基类构造函数名(参数名列表),子对像名(参数列表)
{
派生类新增成员初始化语句
}
若基类包含其它对像,则先执行基类中对像的构造函数,再执行基类的构造函数,再执行派生类成员对像的构造函数,最后才执行派生类的构造函数。而析构函数的调用顺序正好相反,且被自动调用。即按照所谓的“继承顺序”依次建立整个派生类。
现像:即继承时多个基类包含相同的成员,编译系统无法判定选择哪个基类的成员。
解决方法:添加类作用域运算符“:”,如C1.BaseClass::display()。
使用虚基类:class 派生类名:virtual
public/private/protect 基类名,当基类通过多条路径被一个派生类继承时,该派生类只继承该基类一次,即保留一份基类成员;而不必要重复包含多次。在最后的派生类中需要对直接基类和虚基类初始化。编译器不会自动调用虚基类的构造函数,而需要在最后的派生类中手动调用。
公有派生类的对像可作为其相应的基类对像处理;即可以将派生类指针转换为基类指针,访问基类的成员,但不可访问派生类的成员。反过来是“不可逆”的。即派生类属于基类,但基类不属于派生类。
可以用派生类对像向子类赋值;
派生类对像可以向基类对像的引用进行赋值或初始化;
派生类对像的地址可赋值给基类对像的指针变量。
[U1]完全防止外部调用,但是又开放了部分权限,且后续继承的类仍然可继续访问。
[U2]Pblic,保留原有的特性,仅隐藏Private特性隐藏基类的内部实现,信息隐藏
[U3]Private接口完全由派生类使用,外部只能调用派生类的公用接口。权限更强
文章评论(0条评论)
登录后参与讨论