欢迎来到天天文库
浏览记录
ID:34717587
大小:55.54 KB
页数:11页
时间:2019-03-10
《虚继承与虚基类的本质》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、虚继承与虚基类的本质 虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然这两个概念的定义是非常的简单明确的,但是在C++语言中虚继承作为一个比较生僻的但是又是绝对必要的组成部份而存在着,并且其行为和模型均表现出和一般的继承体系之间的巨大的差异(包括访问性能上的差异),现在我们就来彻底的从语言、模型、性能和应用等多个方面对虚继承和虚基类进行研究。 首先还是先给出虚继承和虚基类的定义。 虚继承:在继承定义中包含了virtual关键字的继承关系; 虚基类:在虚继承体系中的通过vi
2、rtual继承而来的基类,需要注意的是: structCSubClass:publicvirtualCBase{};其中CBase称之为CSubClass 的虚基类,而不是说CBase就是个虚基类,因为CBase还可以不不是虚继承体系 中的基类。 有了上面的定义后,就可以开始虚继承和虚基类的本质研究了,下面按照语法、语义、模型、性能和应用五个方面进行全面的描述。 1.语法 语法有语言的本身的定义所决定,总体上来说非常的简单,如下:
3、 structCSubClass:publicvirtualCBaseClass{}; 其中可以采用public、protected、private三种不同的继承关键字进行修饰,只要 确保包含virtual就可以了,这样一来就形成了虚继承体系,同时CBaseClass就成为 了CSubClass的虚基类了。 其实并没有那么的简单,如果出现虚继承体系的进一步继承会出现什么样的状况呢? 如下所示: /* *带有数据成员的基类
4、 */ structCBaseClass1 { CBaseClass1(size_ti):m_val(i){} size_tm_val; }; /* *虚拟继承体系 */ structCSubClassV1:publicvirtualCBaseClass1 {
5、 CSubClassV1(size_ti):CBaseClass1(i){} }; structCSubClassV2:publicvirtualCBaseClass1 { CSubClassV2(size_ti):CBaseClass1(i){} }; structCDiamondClass1:publicCSubClassV1,pu
6、blicCSubClassV2 { CDiamondClass1(size_ti):CBaseClass1(i),CSubClassV1(i),CSubClassV2(i){} }; structCDiamondSubClass1:publicCDiamondClass1 { CDiamondSubClass1(size_ti):CBaseClass1(i),CDi
7、amondClass1(i){} }; 注意上面代码中的CDiamondClass1和CDiamondSubClass1两个类的构造函数初始化列 表中的内容。可以发现其中均包含了虚基类CBaseClass1的初始化工作,如果没有这 个初始化语句就会导致编译时错误,为什么会这样呢?一般情况下不是只要在 CSubClassV1和CSubClassV2中包含初始化就可以了么?要解释该问题必须要明白虚 继承的语义特征,所以参看下面语义部分的解释。
8、 2.语义 从语义上来讲什么是虚继承和虚基类呢?上面仅仅是从如何在C++语言中书写合法的 虚继承类定义而已。首先来了解一下virtual这个关键字在C++中的公共含义,在C++ 语言中仅仅有两个地方可以使用virtual这个关键字,一个就是类成员虚函数和这里 所
此文档下载收益归作者所有