多继承的详细认识

简介: 多继承的详细认识

目录

前言

多继承和虚基类的概念

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

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


前言

之前我们介绍了 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();

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

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

相关文章
|
编译器 C++
48 C++ - 多继承
48 C++ - 多继承
59 0
|
C++
52 C++ - 纯虚函数和多继承
52 C++ - 纯虚函数和多继承
25 0
|
6月前
|
C++
C++程序中的多重继承
C++程序中的多重继承
65 1
|
6月前
|
C++
50多重继承
50多重继承
28 0
|
6月前
|
C++
C++多继承与多态
C++多继承与多态
19 0
|
6月前
|
存储 NoSQL 编译器
『 C++类与对象 』多态之单继承与多继承的虚函数表
『 C++类与对象 』多态之单继承与多继承的虚函数表
|
6月前
|
存储 NoSQL C++
『 C++类与对象 』多继承与虚继承
『 C++类与对象 』多继承与虚继承
|
6月前
|
C++
C++继承、多继承及菱形继承
C++继承、多继承及菱形继承
|
Java 编译器 PHP
C++的多重继承
派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明派生类D: class D: public A, private B, protected C{ //类D新增加的成员 } D 是多继承形式的派生类,它以公有的方式继承 A 类,
C++单继承和多继承
C++单继承和多继承