指针到基类的不明确转换
到类型 A*(指向 A 的指针)的转换是不明确的,因为无法辩明 A 类型的哪个子对象是正确的。请注意,您可以通过显式指定要使用的子对象来避免多义性,如下所示:
(A *)(B *)&d // Use B subobject.
(A *)(C *)&d // Use C subobject.
多义性和虚拟基类
如果使用虚拟基类,则函数、对象、类型和枚举数可通过多重继承路径到达。因为仅有一个基类实例,因此在访问这些名称时不存在二义性。
下图显示如何使用虚拟和非虚拟继承构成对象。
虚拟和非虚拟派生
在该图中,通过非虚拟基类访问类 A 的任何成员都将导致二义性;编译器没有解释是使用与 B 关联的子对象还是与 C 关联的子对象的信息。但是,将 A 指定为虚拟基类时,访问哪一个子对象都不成问题。
注:相关教程知识阅读请移步到C++教程频道。











