C++多继承的二义性
来源:优易学  2010-1-14 10:45:39   【优易学:中国教育考试门户网】   资料下载   IT书店

  同样地,类C中成员函数调用f()也会出现二义性问题。例如:
  viod C::h()
  {
  f();
  }
  这里有二义性问题,该函数应修改为:
  void C::h()
  {
  A::f();
  }
  或者
  void C::h()
  {
  B::f();
  }
  或者
  void C::f()
  {
  A::f();
  B::f();
  }
  另外,在前例中,类B中有一个成员函数g(),类C中也有一个成员函数g()。这时,
  c1.g();
  不存在二义性,它是指C::g(),而不是指B::g()。因为这两个g()函数,一个出现在基类B,一个出现在派生类C,规定派生类的成员将支配基类中的同名成员。因此,上例中类C中的g()支配类B中的g(),不存在二义性,可选择支配者的那个名字。
  当一个派生类从多个基类派生类,而这些基类又有一个共同的基类,则对该基类中说明的成员进行访问时,也可能会出现二义性。例如:
  class A
  {
  public:
  int a;
  };
  class B1 : public A
  {
  private:
  int b1;
  };
  class B2 : public A
  {
  private:
  int b2;
  };
  class C : public B1, public B2
  {
  public:
  int f();
  private:
  int c;
  };
  已知:C c1;
  下面的两个访问都有二义性:
  c1.a;
  c1.A::a;
  而下面的两个访问是正确的:
  c1.B1::a;
  c1.B2::a;
  类C的成员函数f()用如下定义可以消除二义性:
  int C::f()
  {
  retrun B1::a + B2::a;
  }
  由于二义性的原因,一个类不可以从同一个类中直接继承一次以上,例如:
  class A : public B, public B
  {
  …
  }
  这是错误的。

上一页  [1] [2] [3] 

责任编辑:cyth

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训