虚基类及虚基类的定义使用

虚基类

在前面学过的继承过程中,不知道大家有没有想到这种情况:在多继承关系中,如果一个派生类的从两个父类那里继承过来,并且这两个父类又恰恰是从一个基类那里继承而来。那这样就麻烦了,因为你可能继承了两份一样的成员!

这就出现了所谓二义性问题,下面我们展开学习:

先给大家举一个能说明这种多继承的例子吧,笔者我想来想去,想了这么一个例子:以前呢有一个大户人家,起初呢就两口子,男主人掌权,保管着大门钥匙,后来他们有两个儿子,若干年后长大成人,男主人也老了,就把钥匙又配了两把,分别交给他的两个儿子,交由他们主持家业,又过去好多年,两个儿子也都成了家,又分别有一男一女,也就是家里的孙子孙女,传宗接代。所谓人丁兴旺吖,后来他们也长大成人,又到了交接钥匙的时候,古代当然钥匙要传给男孩啦,那么这个时候,当然给孙子啦,这个时候呢孙子的爹和他的叔伯(也就是最初主人的俩儿子)都要配一个钥匙给这个孙子,他手上就有了两把。小孙子看着手里两把钥匙,说:“一把就够!两把…这不浪费嘛!”

看完这个故事,大家就好理解多继承了,故事中最初的男主人,也就是爷爷,就是基类,他的两个孩子,是两个派生类,然后其中一个人的孩子,就是那个小孙子,就是最后的派生类,由于他继承自两个派生类。且这两个派生类都有一个共同的成员(钥匙,因为都继承同一个基类--爷爷)。最后的小孙子的派生类有两个重复的成员(钥匙),就是二义性的根源所在!

下面,我们按照这个例子,具体成代码,大家可以参考:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

/**************************************

//Des:C++教程demo

//Author:Huang

//Copyright:www.dotcpp.com

//Date:2017/12/18

**************************************/

#include <iostream>

using namespace std;

class Grandfather

{

public:

    int key;

public:

  

};

class Father1:public Grandfather

{

  

};

class Father2:public Grandfather

{

  

};

class Grandson:public Father1,public Father2

{

  

};

  

int main()

{

  

    Grandson A;

    //A.key=9;

    return 0;

}

代码就是刚才故事的一个表现,为了方便形容,定义的四个类都很空,重点看继承关系即可。即Grandson类继承两个father类,会有两个key成员,这个时候如果试图使用这个key,注意已经声明为public类型,在主函数中试图赋值时候,会有“不唯一、模棱两可”的错误提示,即所谓的二义性问题发生。大家可以好好体会。

那么如何规避这个问题呢?即使用虚基类!

所谓虚基类就是在继承的时候在继承类型public之前用virtual修饰一下 。比如还是这个例子,只需要父亲类在继承爷爷类的时候多加一个virtual,那么这个时候,派生类和基类就只维护一份一个基类对象。避免多次拷贝,出现歧义。银行从业考试大纲

定义方法即在两个父亲类的派生时增加virtual的声明:

class Father1:virtual public Grandfather

class Father2:virtual public Grandfather

其余不变,大家可以自行上机测试,理解二义性的产生及虚基类的用法。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值