|
在使用非虚基类时,如果从不同的类那里继承了两个或多个同名成员(数据或方法),则在使用该成员名时,如果没有用类名进行限定,将导致二义性。如果使用的是虚基类,这样做不一定会导致二义性。在这种情况下,如果某个名称优先于其它所有名称,那么在使用它时,即便不使用限定符,也不会导致二义性。
一个成员名如何优先于另一个成员名呢?派生类中的名称优先于直接或间接祖先类中的相同名称。例如,在下面的定义中:- class B
- {
- public:
- short q();
- ...
- };
- class C : virtual public B
- {
- public:
- long q();
- int omg();
- ...
- };
- class D : public C
- {
- ...
- };
- class E : virtual public B
- {
- private:
- int omg();
- ...
- };
- class F : public D, public E
- {
- ...
- };
复制代码 上面代码中,类 C 中的 q() 定义优先于类 B 中的 q() 定义,因为类 C 从类 B 派生而来。因此,F 中如果直接使用了 q() ,那么它表示的 C::q() 。另一方面,对于类 C 和 类E,任何一个类中的 omg() 的定义都不优先于另一个,因为 C 和 E 都不是对方的基类。所以,在 F 中使用非限定的 omg() 将导致二义性。
虚二义性规则与访问规则无关,也就是说,即使 E::omg() 是私有的(不能在类 F 中直接访问),但使用 omg() 仍将导致二义性。同样,即使 C::q() 是私有的,它也将优先于 D::q()。在这种情况下,可以在类 F 中调用 B::q(),如果不这样限定,那么就意味着调用不可访问的 C::q() 。
|
|