曲径通幽论坛

标题: [虚基类]名称的优先规则 [打印本页]

作者: easy    时间: 2013-12-15 15:32
标题: [虚基类]名称的优先规则
在使用非虚基类时,如果从不同的类那里继承了两个或多个同名成员(数据或方法),则在使用该成员名时,如果没有用类名进行限定,将导致二义性。如果使用的是虚基类,这样做不一定会导致二义性。在这种情况下,如果某个名称优先于其它所有名称,那么在使用它时,即便不使用限定符,也不会导致二义性。
一个成员名如何优先于另一个成员名呢?派生类中的名称优先于直接或间接祖先类中的相同名称。例如,在下面的定义中:
  1. class B
  2. {
  3. public:
  4.     short q();
  5.     ...
  6. };

  7. class C : virtual public B
  8. {
  9. public:
  10.     long q();
  11.     int omg();
  12.     ...
  13. };

  14. class D : public C
  15. {
  16.    ...
  17. };

  18. class E : virtual public B
  19. {
  20. private:
  21.     int omg();
  22.     ...
  23. };

  24. class F : public D, public E
  25. {
  26.    ...
  27. };
复制代码
上面代码中,类 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() 。





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2