曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2279|回复: 0
打印 上一主题 下一主题

[虚基类]名称的优先规则

[复制链接]

716

主题

734

帖子

2946

积分

超级版主

Rank: 9Rank: 9Rank: 9

积分
2946
跳转到指定楼层
楼主
发表于 2013-12-15 15:32:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在使用非虚基类时,如果从不同的类那里继承了两个或多个同名成员(数据或方法),则在使用该成员名时,如果没有用类名进行限定,将导致二义性。如果使用的是虚基类,这样做不一定会导致二义性。在这种情况下,如果某个名称优先于其它所有名称,那么在使用它时,即便不使用限定符,也不会导致二义性。
一个成员名如何优先于另一个成员名呢?派生类中的名称优先于直接或间接祖先类中的相同名称。例如,在下面的定义中:
  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() 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-17 23:36 , Processed in 0.077051 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表