程序语言中极为少见的多继承在C中是怎

白癜风哪家医院治疗好 https://myyk.familydoctor.com.cn/2831/department/

多继承

在我们前面介绍的内容中,一个派生类继承一个基类,我们称之为单继承。C++也支持多继承,即一个派生类继承多个基类,参见图1。

图1 多继承的例子

多继承与单继承的派生类定义,构造函数和析构函数的调用顺序很类似。

定义多继承的派生类的格式如下:

class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,……

多继承中,派生类的构造函数的定义格式如下:

<派生类构造函数名>(<总参数表>):<基类1构造函数名>(<参数表1>),<基类2构造函数名>(<参数表2>),……

多继承中的构造函数和析构函数。

例1中派生类Z继承了两个基类X和Y所有的公有和保护成员,由于两个基类有带参的构造函数,派生类构造函数应该在成员初始化表中调用它们:

那么在调用基类构造函数时,是先调用X的构造函数,还是先调用Y的构造函数呢?实际上基类构造函数的调用顺序与在定义派生类时指定的顺序相同,即与“classZ:publiX,publicY”的书写有关,而与它们在成员初始化表中出现的顺序无关。那么本例中,X的构造函数应该在Y的构造函数之前调用,即使我们把Z的构造函数改成下面的形式,也仍然如此:

析构函数的调用顺序与构造函数的调用顺序相反,类X、Y、Z析构函数的调用顺序为:~Z、~Y、~X。

派生类对象包含每一个基类对象的成员,图9.4表示了Z对象与它的基类对象之间的关系:

图2 Z对象与它的基类对象之间的关系

在多继承时,C++并没有限制基类的个数,但不能有相同的基类,下面这样写就是错误的:

多继承类成员的引用比单继承复杂。假定Z的基类X和Y均有成员函数H。

我们也可以在Z类中定义H成员,并调用基类的H成员。

派生类Z将继承X类的H成员函数和Y类的H成员函数,使得下面的调用发生歧义:

ZzObj;

zObj.H(0);

编译器并不知道是要调用X:H,还是Y:H,我们可以通过显式调用来解决这个问题:

ZObj.Y:H(0);

图3 复杂的多继承

当继承基类时,派生类对象就包含了每一个基类对象的成员。假定以类X和类Y为基类派生出类Z,类Z就会同时包含类X和类Y的数据成员,如图9.4表示。

如果类X和类Y都是从相同的基类A派生的,那么从类层次上看,就成了一个菱形的结构,如图9.5所示。没有菱形的情况,多继承并没有什么麻烦。一旦出现菱形的情况,事情就变得复杂起来。首先,对于A类的数据成员来说,它在Z中是重叠的,即在Z中它有两个副本,这不仅增加了存储空间,更严重的是产生了二义性。

假如类X和类Y都实现了一个func1()函数,当Z从X和Y继承时,就会导致一个冲突:当我们使用基类指针调用虚函数func1()时,编译器就不知道它调用的是类X还是类Y的成员,这样编译器就会给出一个错误信息:“Z:func1isambiguous”。正确的做法是必须在类Z中重定义func1()函数,以消除二义性。

超实用性的Python零基础入门到进阶视频源码淘宝¥2购买已下架

好了,本文到此结束。如果对编程、计算机、程序员方面感兴趣的话,欢迎私信联系我,随时交流!点个


转载请注明:http://www.nydjfy.com/zyyd/zyyd/16083.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了