派生关系中的二义性处理

1.  单继承时父类与子类间重名成员的处理

 

   单继承时父类与子类间成员重名时,按如下规定进行处理:对子类而言,不加类名限定时默认为是处理子类成员,而要访问父类重名成员时,则要通过类名限定。

 

#include <iostream.h>

class CB {

    public:

  int a;

  CB(int x){a=x;}

  void showa(){cout<<"Class CB -- a="<<a<<endl;}

}; 

classCD:public CB {

public:

  int a;    //与基类a同名

  CD(int x, int y):CB(x){a=y;}

  void showa(){  //与基类showa同名

  cout<<"Class CD -- a="<<a<<endl;

  }

  voidprint2a() {

  cout<<"a="<<a<<endl;   //子类a

  cout<<"CB::a="<<CB::a<<endl;   //父类a

  }

}; 

void main() {

  CB CBobj(12);

  CBobj.showa();

  CD CDobj(48, 999);

  CDobj.showa();  //子类的showa

  CDobj.CB::showa();  //父类的showa

  cout<<"CDobj.a="<<CDobj.a<<endl;

  cout<<"CDobj.CB::a="<<CDobj.CB::a<<endl

}

    程序执行后的显示结果如下:

Class CB -- a=12

Class CD -- a=999

Class CB -- a=48

CDobj.a=999

CDobj.CB::a=48 

       2.  多继承情况下二基类间重名成员的处理

 

      多继承情况下二基类间成员重名时,按如下方式进行处理:对子类而言,不加类名限定时默认为是处理子类成员,而要访问父类重名成员时,则要通过类名限定。

  

#include <iostream.h>

classCB1 {

public:

  int a;

  CB1(int x){a=x;}

  void showa(){ cout<<"ClassCB1 ==> a="<<a<<endl;}

}; 

class CB2 {

 public:

  inta;

  CB2(intx){a=x;}

  voidshowa(){cout<<"ClassCB2 ==> a="<<a<<endl;}

};

 

class CD:publicCB1,  public CB2 {

   public:

  inta;         //与二基类数据成员a同名

  CD(intx, inty, intz):CB1(x),CB2(y){a=z;}

void showa(){  //与二基类成员函数showa同名

     cout<<"ClassCD ==> a="<<a<<endl;

  }

  voidprint3a() {

  //显示出派生类的a及其二父类的重名成员a

  cout<<"a="<<a<<endl;

  cout<<"CB1::a="<<CB1::a<<endl;

  cout<<"CB2::a="<<CB2::a<<endl;

  }

};

void main() {

  CB1 CB1obj(11);

  CB1obj.showa();

  CD CDobj(101, 202,909);

  CDobj.showa();  //子类showa

  CDobj.CB1::showa();  //父类showa

  cout<<"CDobj.a="<<CDobj.a<<endl;

  cout<<"CDobj.CB2::a="<<CDobj.CB2::a<<endl;

}

 

    程序执行后的显示结果如下:

Class CB1 ==> a=11

Class CD ==> a=909

Class CB1 ==> a=101

CDobj.a=909

CDobj.CB2::a=202

     3.  多级混合继承(非虚拟继承)
     包含两个基类实例情况的处理

多级混合继承情况下,若类D从两条不同路径同时对类A进行了一般性继承(非虚拟继承)的话,则类D的对象中会同时包含着两个类A的实例。此时,对类D而言,要通过类名限定来指定访问两个类A实例中的哪一个。

多级混合继承情况下,若类D从两条不同路径同时对类A进行了一般性继承(非虚拟继承)的话,则类D的对象中会同时包含着两个类A的实例。此时,对类D而言,要通过类名限定来指定访问两个类A实例中的哪一个。

 

    本例的类间继承关系示例如下:

class A

class B : public A

class C : public A

class D : public B, public C

   存储结构示意:

( ( (A) B ) ( (A) C ) D ) 

上述多级混合继承关系应用例举:

      例1. 类A--人员类;  类B--学生类; 类C--助教类;类D--学生助教类。

      例2. 类A--人员类;  类B--学生类; 类C--工人类;类D--工人学生类。

      例3. 类A--家具类;  类B--沙发类; 类C--床类;   类D--沙发床类。

  

#include <iostream.h>

class A {

public:

  int a;

  A(int x){a=x;}

  void showall(){cout<<"a="<<a<<endl;}

}; 

class B:public A {

public:

  int b;

  B(int x):A(x-1){b=x;}

};

 

class C:public A {

public:

  int c;

  C(int x):A(x-1){c=x;}

};

classD:public B,public C {

public:

  int d;

  D(int x, inty, intz):B(x+1),C(y+2){d=z;}

  void showall() {

  cout<<"C::a="<<C::a<<endl;

     //在类D定义范围内,要通过类名限定来指定

    //访问两个类A实例中的哪一个

  cout<<"B::a="<<B::a<<endl;

  cout<<"b,c,d="<<b<<","<<c<<", "<<d<<endl;

     //b、c、d不重名,具有唯一性

  }

}; 

void main() {

  D Dobj(101, 202, 909); 

  Dobj.showall();

  cout<<"-------------------"<<endl;

  cout<<"Dobj.C::a="<<Dobj.C::a<<endl;

  //访问类D的从C继承而来的a

  cout<<"Dobj.B::a="<<Dobj.B::a<<endl;

}

    程序执行后的显示结果如下:

C::a=203

B::a=101

b,c,d=102, 204, 909

-------------------

Dobj.C::a=203

Dobj.B::a=101





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值