C++之虚继承

本文主要介绍C++中虚继承的相关内容

I、菱形继承

要了解C++的虚继承,首先要先了解菱形继承的概念及其带来的危害。

1、菱形继承是指一个派生来通过不同的继承途径,继承了同一个基类的内容,如下图所示:

多重继承示意图

2、上图中的继承关系会造成两个方面的影响,一是派生类D会存在两份基类A中的拷贝,这样会造成内存的浪费,而是在发生动态绑定时,会存在虚函数调用的二义性

II、虚继承

1、虚继承就是为了解决上述的两个问题,虚继承的机构如下图所示:

2、虚继承的底层实现 :

虚继承一般通过虚基类指针虚基类表实现,每个虚继承的子类都有一个虚基类指针和虚基类表(由虚基类指针指向)。

虚基类表中记录了虚基类与本类的偏移地址;通过偏移地址,就找到了虚基类成员,而虚继承也不用像普通多重继承一样需要维护两份拷贝,这样节省了存储空间。

3、上述描述解决了菱形继承中的浪费内存空间的问题,但还未解决二义性问题,在虚继承中,如果B和C都重写了A中的虚函数a(),则D必须重写虚函数a(),否则会出现二义性问题。

详细内容可以参考探索多态模型—菱形继承和菱形虚拟继承一文。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容