与基类对象和派生类对象相关的赋值兼容问题

派生类对象间的赋值操作依据下面的原则:

n 1 )如果派生类有自己的赋值运算符的重载定义,即按该重载函数处理。
n 2 )派生类未定义自己的赋值操作,而基类定义了赋值操作,则系统自动定义派生类赋值操作,其中基类成员的赋值按基类的赋值操作进行。
n 3 )二者都未定义专门的赋值操作,系统自动定义缺省赋值操作(按位进行拷贝)。

另一方面,基类对象和派生类对象之间允许有下述的赋值关系(允许将派生类对象当作基类对象来使用):

n 1 基类对象 = 派生类对象

  只赋共性成员部分 ,反方向的下述赋值不被允许

n 2 指向基类对象的指针 = 派生类对象的地址

  下述赋值不允许:指向派生类类型的指针 =基类对象的地址。注:访问非基类成员部分时,要经过指针类型的强制转换

n 3 基类的引用 = 派生类对象

  下述赋值不允许:派生类的引用 = 基类对象。

  注:通过引用只可以访问基类成员部分

  #include<iostream.h>

 class base{ //基类base

  int a;

 public:

  base (intsa) {a=sa;}

  intgeta(){return a;} };

classderived:publicbase { //派生类derived

  int b;

public:

  derived(intsa, intsb):base(sa){b=sb;}

  int getb (){return b;} 
};

voidmain () {
base bs1(123);  
// base 类对象bs1

  cout<<"bs1.geta()="<<bs1.geta()<<endl;

  derived der(246,468);        // derived 类对象der

  bs1=der;         //OK! “基类对象=派生类对象;”

  cout<<"bs1.geta()="<<bs1.geta()<<endl;

  //der=bs1;   //ERROR! “派生类对象 = 基类对象;”

  base *pb= &der;

  //“指向基类型的指针=派生类对象的地址;”

   cout<<"pb->geta()="<<pb->geta()<<endl;

  //访问基类成员部分

  //cout<<pb->getb()<<endl;

   //ERROR! 直接访问非基类成员部分

  cout<<"((derived*)pb)->getb()="<<((derived *)pb)->getb()<<endl;  

  //访问非基类成员部分时,要经过指针类型的强制转换

  //derived *pd= &bs1; //ERROR! “指向派生类类型的指针=基类对象的地址;” } 

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

  bs1.geta()=123

  bs1.geta()=246

  pb->geta()=246

  ((derived*)pb)->getb()=468 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值