派生类向基类类型转换的可访问性

本文探讨了派生类向基类转换的规则及其影响因素,包括不同继承方式下用户代码、派生类成员及友元如何进行类型转换,并分析了私有继承时的特殊情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

派生类向基类转换是否可访问是由使用该转换的代码决定,同时派生类的派生访问说明符也会有影响 , 假定 继承B

 

1:只有当D公有继承B时,用户代码才能使用派生类向基类的转换;如果D继承B的方式是受保护的或者私有的,则用户代码不能使用该转换。

  class B{};                                     

class D: public B{};                          

int main(){          

        D d ;       

     B &b = d ; //正确                    

  return 0 ;                             

}              

class B{};         

class D: protected B{};             

class D1 : private B{} ;      

int main(){

D  d  ; 

 D1  d1 ;

  B &b = d ; // 错误

B  &b1 = d1 ; //错误

                         return 0 ;

                  }

 

2: 无论D以什么方式继承BD的成员和友元都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的。

class B{};   class D1 : protected B{

class D:  protected B{ friend void  ff() ;

public :  public :

void f(){ void f1(){

D d ; D1 d1 ;

  B &b = d; //正确        B &b1 = d1 ;//正确

} }

}; };

void ff() { class D2 : private B{

D1 d1 ; public :

B &b1 = d1 ; //正确 void f2(){

} D2 d2 ;

B &b2 = d2 ;//正确

}

};

 

3:如果D继承B的方式是公有或者受保护的,则D的派生类的成员和友元可以使用DB的类型转换;反之,如果D继承B的方式是私有的,则不能使用。

class B{};

class D:  private B{ };

class DD : public D{

void fd(){

D dd ;

B &bb = dd ; // 错误

}

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值