农民工

白话C++系列(21) -- 虚继承

試著忘記壹切 提交于 2020-01-22 21:32:10
虚继承 多继承+多重继承的烦扰 先来看一个例子,在这个例子中,类A是父类,类B和类C继承了类A,而类D既继承类B又继承类C(如下图所示),我们称这种继承关系又称之为菱形继承。在菱形继承中我们发现,既有多继承,也有多重继承 那么,现在问题来了…… 当我们要实例化D的对象的时候呢,我们发现,D是从B继承来的,B又是从A继承来的;而D也是从C继承来的,C又是从A继承来的,这样一来,D中就含有两个一样的A的数据,而这种情况是我们不能容忍的。因为在一个对象当中有两份完全相同的数据,这种冗余数据我们没有办法来承担它的系统开销,所以我们必须要解决。也许,你会说在实际的工作中会遇到这么复杂的情况吗?我们来看一看,不用实际工作,我们只需要回顾一下前面举过的例子:之前我们讲过人这个类,也讲过工人,农民和农民工这三个类,那么,工人和农民可以继承人这个类,而农民工则既可以继承农民,也可以继承工人这两个类(如下) 那么,这种典型的菱形继承关系用什么办法刚才我们所说的数据冗余的问题呢?那就要用到接下来要讲到的虚继承相关知识。 虚继承 虚继承是继承的一种方式,其关键字是virtual,我们来看一看如何使用,请看下面这个例子。 在这个例子中,我们定义了一个工人的类,工人的类要去继承人这个类,而工人这个类将来也会被农民工这个类所继承,我们就把工人这个类就称之为虚基类。那么,在工人这个类去继承人这个类的时候