欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ 虚继承

程序员文章站 2024-01-17 12:16:04
前言 虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。 虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推 ......

前言

虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。

 

虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在c++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要,因为这样只会降低效率和占用更多的空间。

例如菱形继承:

C++ 虚继承

 

 类 a 派生出类 b 和类 c,类 d 继承自类 b 和类 c,这个时候类 a 中的成员变量和成员函数继承到类 d 中变成了两份,一份来自 a-->b-->d 这条路径,另一份来自 a-->c-->d 这条路径。

注意:

多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生

virtual修饰继承方式:

1 //继承的动作 虚继承
2 //父类:虚基类
3 class 子类:virtual public 父类
4 {
5 
6 };
vbptr(虚基类指针) 其中v是virtual 虚 b是base 基类 prt指针
(vbptr指向虚基类表)
vbtable(虚基类表 ) 保存了当前的虚指针相对于虚基类的首地址的偏移量
 
总结:之所以 产生 vbptr和vbtable 目的 保证 不管多少个继承 虚基类的数据只有一份。