继续整理函数调用的第三种情况内容,注:以下部分图片来自于原文
3. 虚拟继承情况下的虚函数调用:
如下例子,Point3d虚拟继承自Point2d:
此时的内存布局如下,注意此时虽然Point3d只有唯一一个基类(最左边的)Point2d,但是它们的布局并不像非虚拟继承的单一继承那样,二者之间不再相符,二者之间的转换也就需要调整this指针,因为此时Point3d中继承而来的Point2d子对象地址与Point3d并不一致(注:原书中下图的mumble()方法为Point3d,但实际上Point3d中,并未重写该方法,所以应该为Point2d):
虚拟继承带来了前所未有的复杂性,当一个虚基类从另一个虚基类继承而来时,并且两者都支持虚函数和非静态数据成员,此时编译器对于虚基类的支持就像进了迷宫一样,所以,对于虚基类,不要在其中声明非静态数据成员。