C++第十五章:派生类向基类的转换可访问性

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

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

1.只有当D公有继承B时,**用户代码(其实就是对象)**才能使用派生类向基类到转换;如果D继承B的方式时受保护的或者私有的,则用户代码不能使用该转换。

(p对应的类是基类 -- d1 d2 d3  对应的类是基类的继承(继承方式如下) -- 
dd1 dd2 dd3对应的类d1 d2 d3的类的继承(都是public继承) )

(p d1 d2 d3 dd1 dd2 dd3都是各自类的对象)

Base *p = &d1;  // d1 has type Pub_Derv from Base     --  legal
p = &d2;        // d2 has type Priv_Derv from Base  因为d2不是公有继承  --  illegal
p = &d3;        // d3 has type Prot_Derv from Base  因为d3不是公有继承--  illegal

p = &dd1;       // dd1 has type Derived_from_Public  Der public form d1    --  legal
p = &dd2;       // dd2 has type Derived_from_Private Der public form d2 
                //d2都不能转换了    --  illegal
p = &dd3;       // dd3 has type Derived_from_Protected Der public form d3 --  illegal
                //d3都不能转换了    --  illegal

2.不论D以什么方式继承B,D的成员函数和友员函数都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员和友员而言永远是可访问的。

class B{
};
class D:public B{
    void function(D &d){
        B b = d;
    }
    friend void friendFunction(D &d)
    {
        B b = d;
    }
};
class E:protected B{
    void function(E &e){
        B b = e;
    }
    friend void friendFunction(E &e)
    {
        B b = e;
    }
};
class F:private B{
    void function(F &f){
        B b = f;
    }
    friend void friendFunction(F &f)
    {
        B b = f;
    }
};

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

也就是dd1和dd2对应类中成员和友员可以使用D向B的类型转换,dd3对象类的成员和友员不行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值