派生类的概念和定义
① 定义格式
派生类定义的语法为:
class 派生类名:继承方式1 基类名1, 继承方式2 基类名2,…
{
private:
派生类的私有数据和函数
public:
派生类的公有数据和函数
protected:
派生类的保护数据和函数
};
说明:
•继承方式1 基类名1, 继承方式2 基类名2,…”为基类名表, 表示当前定义的派生类的各个基类。
•如果基类名表中只有一个基类,表示定义的是单继承;如果基类名表中有多个基类,表示定义的是多继承。
•继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限。继承方式有三种:public:公有继承;private:私有继承;protected:保护继承。不管是哪种继承方式,基类的私有成员在派生类的作用域内不可见。派生类的成员函数不能直接访问基类的私有成员,但可直接访问基类的公有和保护成员。
•在派生类的定义中,每一种继承方式只限定紧跟其后的那个基类。如果不显式给出继承方式,系统默认为私有继承。
② 继承分类
•单一继承时的构造函数
派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数)
{
本类成员初始化赋值语句;
};
•多继承:允许派生类同时具有多个基类,基类和派生构成有向图的层次结构。多继承时的构造函数
派生类名::派生类名(基类1形参,基类2形参,…基类n形参,本类形参):基类名1(参数), 基
类名2(参数), …基类名n(参数)
{
本类成员初始化赋值语句;
};
③ 二义性问题
一般来说,在派生类中对于基类成员的访问应该是唯一的,但是,由于多继承中派生类拥有多个基类,如果多个基类中拥有同名的成员,那么,派生类在继承各个基类的成员之后,当我们调用该派生类成员时,由于该成员标识符不唯一,出现二义性,编译器无法确定到底应该选择派生类中的哪一个成员,这种由于多继承而引起的对类的某个成员访问出现不唯一的情况就称为二义性问题。
▼二义性的解决方法
•解决方法一:用类名来限定,通过类的作用域分辨符明确限定出现歧义的成员是继承自哪一个基类。
•解决方法二:同名覆盖,在派生类中新增一个与基类中成员相同的成员,由于同名覆盖,程序将自动选择派生类新增的成员。
④ 虚基类
为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
•虚基类的定义
虚基类的定义是在融合在派生类的定义过程中的,其定义格式如下:class 派生类名:virtual 继承方式 基类名