钻石继承和虚基类
当我们一个类去继承的两个父类有相同的数据成员时,我们想给这个成员赋值就要遇到问题了,我们必须用类名去驱动它,不然我们就不知道到底是给哪个成员赋值,下面举个例子。
这样看来是很好的解决我们的问题,但是当我们的父类继承它自己的父类,而我们想从子类中访问父类的父类数据时,我们通过加类名去驱动也可以实现。但是我们明明是修改的同一个数据但是却给的不同的值,和我们现实情况不同。语言可能生涩难懂,我们举个例子看看。
图片中可以明显看到我们的m地址不同但是我们m是从同一个地方继承而来,与实际不符。
当然,我们的C++发明者肯定比我们更聪明也注意到这个问题,通过加virtual继承解决这个问题。
我们把B0就称为虚基类,这样就很好解决我们的问题,大家是不是发现C++很有趣呢。
有了虚基类我们的继承是的构造顺序就发生改变,以前是先按继承顺序构造父类,然后构造成员中的对象,再构造自己。有虚基类后,在继承访问顺序上我们先继承带virtual的。
有错误之处还请指教。