5.多重继承派生类的构造函数
派生类构造函数名(总参数表):基类1构造函数(参数表),基类1构造函数(参数表),基类1构造函数(参数表列)
{派生类中新增数据成员初始化语句}
6.多重继承引起的二义性问题
分析一个例子:如果类A和类B中都有成员函数display和数据成员a,类C是类A和类B的直接派生类。下面分别讨论三种情况:
(1)两个基类有同名成员,如果在main函数中定义C类对象c1,并调用数据成员a和成员函数display,由于基类A和B都有数据成员 a和成员函数display,编译系统无法判别要访问的是哪一个基类的成员,因此,程序编译出错。解决办法是用基类名来限定:
c1.A::a=3;
c1.A::display();
(2)两个基类和派生类三者都有同名成员。则:
C c1;
c1.a=3;
c1.display();
此时程序正常运行。但访问的是派生类C中的成员。规则是:基类的同名成员在派生类中被屏蔽,成为“不可见”的,或者说,派生类新增的同名成员覆盖了基类中的同名成员。请注意,不同的成员函数,只有在函数名和参数个数相同,类型匹配的情况下才发生同名覆盖。如果只有参数名相同而参数不同,则属于函数重载。
(3)如果类A和类B是从同一个基类N派生的,而且基类N中有成员函数display和数据成员a,在类A和类B中并没有定义,但是它们 分别从类N继承了数据成员a和成员函数display。
它们是类N成员的拷贝。类A和类B中的数据成员a代表两个不同的存储单元,可以分别存放不同的数据在程序中可以通过类A和类B的构造函数去调用基类N的构造函数,分别对类A和类B的数据成员a初始化。
此时要访问A中的基类成员,则形式如下:
c1.A::a=3;
c1.A::display();
7.虚基类
从上面了解的一样,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。在引用这些同名成员时必须增加直接基类名,以避免二义性。在一个类中保留间接共同基类的多份同名成员,虽然有时是必要的,但在大多数情况下,这种现象是人们不希望出现的。因为保留多份数据成员的拷贝,不仅占用空间,还增加了访问这些成员时的困难。C++提供虚基类的方法,使得在继承间接共同基类时只保留一份成员。声明的一般形式为:
class 派生类名:virtual 继承方式 基类名