我觉得在这里dominance翻译成可见性更好。
假如说在某继承层次上的父类都有同名成员函数,那么子类在调用的时候会直接使用距离自己最近的父类的成员函数,这一点在虚拟继承下同样适用,不过虚拟继承不关注访问权限控制。假如说父类A的同名函数是private的,但是它距离子类最近,A的父类B也有一个同名函数,它是可访问的。这时候在不显式指定哪个类的同名函数时会出现无法访问的错误提示,因为访问的是A的private成员函数。
同样,在不同继承路径中出现同名函数,如不加以显式指定也会出现歧义性。
下面来做个实验。
在非虚拟继承下是否会有访问权限控制呢?就是在类的层次上找到最近的可用的成员函数。
在这个图片中,grandson继承自child,child继承自base,child中的display是private成员,下面看测试代码以及运行结果:
由上图可见,在非虚拟继承情况下,也是不关注访问权限的,从而得知它不是虚拟继承的专利。
接下来再验证一下非虚拟继承下的歧义性问题。
下面来看结果:
由上图可见非虚拟继承下,它也不关注访问权限,也会出现歧义性的问题。
再来看看虚拟继承下的情况。
结果如下:
从结果来看,它仍然不知道要访问哪个类的display,甚至还不知道单一继承路径上的哪个display。
现在我把child中的display注释掉,再看。
还是最近父类的那个display。
总而言之一句话,你调用的方式明确就好,即便是使用虚拟继承也不一定就不产生歧义性,你还是要仔细的。
再有,我怀疑C++ Primer Plus这里是应该是写错了。
应该写成B::q()。