继承中的访问控制

proteced例外

派生类通过派生类对象访问受保护成员,不能通过基类对象访问受保护成员。

继承中的访问控制_第1张图片

三种继承方式

public继承维持基类关键字不变。

protected继承把基类里的pubulic设为protected。降级

private继承把基类里的public和protected变为private。降级。

继承中的访问控制_第2张图片

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

继承中的访问控制_第3张图片

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 *”的转换存在,但无法访问
}
--------------------- 
作者:liufei_learning 
来源:CSDN 
原文:https://blog.csdn.net/liufei_learning/article/details/21587085 
版权声明:本文为博主原创文章,转载请附上博文链接!

1.测试函数说明只有一直公有继承,才说明能在用户代码访问类型转换,印证了规则的第一条

2.B,C,D类都可以访问类型转换,印证了第二条规则

3.E,F,H类,印证了第三条

类的用户

类的实现者:就是自己

普通用户:就是外部调用者

派生类:就是类的孩子

看情况把成员分为三种权限。

友元关系不能继承

基类友元只能访问基类和派生类的基类部分(权限基类控制),派生类友元不能通过基类对象访问基类成员(权限派生类控制)

继承中的访问控制_第4张图片

友元关系不能继承,不能跨界

继承中的访问控制_第5张图片

struct和class区别

1.默认类继承级别

2.默认成员访问说明符

你可能感兴趣的:(C++语言)