C++笔记:派生类到基类转换到可访问性

C++笔记:派生类到基类转换到可访问性

要确定到基类的转换是否可访问,可以考虑基类的public成员是否可访问,如果可以,转换是可以访问的,否则,转换是不可访问的。

如果是public继承,则用户代码和后代类都可以使用派生类到基类的转换。
如果类是使用private或protected继承派生的,则用户代码不能将派生类型对象转换为基类对象。
如果是private继承,则从private继承类派生的类不能转换为基类。
如果是protected继承,则后续派生类的成员可以转换为基类类型。
无论是什么派生访问标号,派生类本身都可以访问基类的public成员,因此,派生类本身的成员和友元总是可以访问派生类到基类的转换。

 

测试代码:

class A{};
 
class B:public A{
public:
    void fun(B&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class C:protected A{
public:
    void fun(C&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class D:private A{
public:
    void fun(D&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class E:public B{
public:
    void fun(B&obj)
    {
        A obj1 = (A)obj;
    }
};
 
class F:public C{
public:
    void fun(C&obj)
    {
        A obj1 = (A)obj;
    }
};
 
//从private继承类派生的类不能转换为基类。
class H:public D{
public:
    void fun(D&obj)
    {
        A obj1 = (A)obj;  //error C2247: “A”不可访问,因为“D”使用“private”从“A”继承
                          //error C2243: “类型转换”: 从“D *”到“const A &”的转换存在,但无法访问
    }
};
 
void inherite_test()
{
    A *pb, *pc, *pe, *pd, *pf, *ph;
     
    pb = new B; //public 
    pc = new C; //protected           error C2243: “类型转换”: 从“C *”到“A *”的转换存在,但无法访问    
    pd = new D; //private             error C2243: “类型转换”: 从“D *”到“A *”的转换存在,但无法访问
    pe = new E; //public + public
    pf = new F; //protected + public  error C2243: “类型转换”: 从“F *”到“A *”的转换存在,但无法访问    
    ph = new H; //private + public    error C2243: “类型转换”: 从“H *”到“A *”的转换存在,但无法访问
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值