21xrx.com
2024-12-22 20:56:13 Sunday
登录
文章检索 我的文章 写文章
C++中虚继承的原理和用法
2023-07-08 09:33:17 深夜i     --     --
虚继承 原理 用法 多重继承 虚基类

C++中的虚继承是一种特殊的继承方式,它可以解决多重继承中出现的"菱形继承"问题。下面,我们将会介绍虚继承的原理以及使用方法。

虚继承的原理

在C++中,若一个类从另外两个类派生而来,并且这两个类又共同派生自同一个基类,那么就会出现"菱形继承"问题。如下图所示:

![图1 菱形继承示意图](https://img-blog.csdn.net/20180812101124169?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Zhc2hlcl9yaWdodC84MDM0MDkzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)

从图中可以看出,派生类D继承了B和C类中都有的成员,导致D中成员变量和B、C类中成员变量有两份一样的副本。这就会出现问题:在调用D类中的成员变量时,不能确定调用B类中的成员变量还是调用C类中的成员变量。

虚继承的作用就是解决这个问题。虚继承允许某一类只在继承体系中出现一次,从而避免出现多份副本。如下图所示:

![图2 使用虚继承避免菱形继承](https://img-blog.csdn.net/20180812101354408?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Zhc2hlcl9yaWdodC84MDM0MDkzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)

如图所示,使用虚继承的结果是D类只继承了A类中的成员,而没有再次继承B和C类中的成员,避免了多份拷贝的问题。

虚继承的用法

在C++中采用虚继承的语法为:


class D : virtual public B, virtual public C

  ...

;

这里虚基类B和C前面的关键字"virtual"起到了关键作用,它表示这两个类是虚基类。

注意事项:

1. 子类必须显式地声明虚继承,否则将默认采用普通的继承方式。

2. 虚基类不能被直接构造和析构。

3. 子类的构造函数必须传递必要的参数来完成虚基类的构造。

4. 使用虚继承会增加一定的程序运行时开销。

总结

虚继承是一种特殊的继承方式,能够避免多份拷贝问题。在面对菱形继承时,可以通过使用虚继承来解决问题。但是,在实际开发中,我们需要充分考虑其带来的运行时开销,仔细设计继承体系,并在构造函数中正确地初始化虚基类。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复