多继承的详细认识

举报
努力变强的小C 发表于 2022/09/30 18:45:43 2022/09/30
【摘要】 多继承的详细认识

目录


前言

多继承和虚基类的概念

声明派生类中多继承的方法

多继承派生类的构造函数和析构函数



前言

之前我们介绍了 C++中的同名成员。以及访问声明。我们也了解了,声明机制可以个别调整私有派生类,从基类继承下来的成员性质以及访问声明中只含不带类型和参数的函数名或变量的访问。下面主要讲解的就是C++中的多基层以及虚基类。

多继承和虚基类的概念

我们前面介绍的单继承就是说一个类是从另一个基类中派生而来。但现实生活中往往有这样一种情况,就是一个派生类中,有两个或者多个基类,那么这个所得的派生类,就可以从两个或者多个基类中继承它所需要的属性,这种方式是非常方便的,它也可以减少C++中代码的重用性,当一个派生类中具有多个基类,那么我们把这种派生方法就称之为多基派生或者叫做多继承,这也是我们要讲解的内容之一。

声明派生类中多继承的方法

在C++中声明多继承的方法与声明单继承的形式相似,只需要将继承的多个基类之间使用逗号分隔开来就可以,下面我们看个例子,它已经声明了类X和类Y,可以声明多重继承的派生类Z

class Z :public X, public Y {
	派生类Z中新增的数据成员和成员函数;
};

以下是声明多继承派生类的一般形式:

class 派生类名:继承方式1 基类名2,继承方式2 基类名1,……继承方式n 基类名n{
    …………
}

在多继承之中,公有继承以及私有继承,对于基类中的成员来说,在派生类中的访问属性,是与单继承的规则是相同的,但是要说明的一点是,对基类成员的访问必须是无二义性的,比如下面的程序是对基类成员访问是二义性的,所以我们要想办法消除二义性

class A {
public:
	int f();
};
class B {
public:
	int f();
	int g();
};
class C : public A, public B {
public:
	int g();
	int h();
};

如定义类C的对象obj:

Z obj;

上述的二义性错误,就是不知道调用的是类A的f()还是类B的f(),我们可以使用成员名限定来消除二义性,如下

obj.X::f();
obj.Y::f();


多继承派生类的构造函数和析构函数

 多继承派生类的构造函数定义形式是以单继承构造函数的定义形式是相似的,只不过在初始表中包含多个基类的构造函数,与单继承派生内的构造函数相同,多继承派生类中的各种函数也必须同时负责该派生类中所有基类的构造函数的调用,多继承构造函数中的调用顺序,也是单继承构造函数中的调用顺序是相同的,也是先调用基类中的构造函数,然后再调用对象成员函数中的构造函数,最后才调用派生类中的构造函数这一原则,处于同一层次之下的各个基类之间的构造函数调用顺序,就是取决于声明派生类中所指定的定义各个基类之间的顺序与派生类构造函数中定义的成员初始化列表之中的各样顺序是没有关系的,析构函数的调用顺序恰好是与各种函数的调用顺序相反

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。