博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++访问控制与继承
阅读量:6192 次
发布时间:2019-06-21

本文共 2238 字,大约阅读时间需要 7 分钟。

  最近,决定认真开始记录自己的学习之路。

  c++类的访问控制有public、private和protected。

  首先要分简单的基类和派生类情况,不是很容易混淆与多级继承时的访问控制。自己原先搞得不清楚,也正是因为没有分开二种情况对待。

  在简单的基类和派生类情况中,其访问控制,可以简单总结:

  public:   1、成员函数   2、类对象   3、友元  4、子类成员函数

  private:  1、成员函数  2、友元  

  protected:  1、成员函数  2、友元   3、子类成员函数

  这些基本都清楚,但是之前比较疑惑的就是继承也有分public、private和protected。其实这是对派生类的子类起作用的,并不影响原先基类和派生类的访问控制。

  大致情况就是:

  假设是public继承,那么原先基类的public、private和protected的访问控制对此基类的派生类的子类不变。

  如果是protected继承,则原先基类的public降为protected,并且也是对基类的派生类的子类起作用。

  而private继承,则把原先基类的public、protected都降为private,并且也是对基类的派生类的子类起作用。

  可以把基类比喻为水龙头,而派生类的public继承为原水龙头大小的管(简称大管)、protected继承为中管、private继承为小管,当水龙头水通过水管是,则把原来水龙头的水缩小了,所以只是对派生类子类起作用的。以下通过代码解释一下:

  class Base  

{  
    public
        int a1;  
        virtual void test() = 0;  
    protected:
        int a2;  
    private:  
        int a3;  
};  
//------------------------------------------------------------------------------  
class Protected_Class_1:protected Base//保护继承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里被转变为protected  
            a2 = 2;//a2在这里被转变为protected  
            //a3=3;//错误,派生类不能访问基类的私有成员  
        }  
};  
class Protected_Class_2:public Protected_Class_1//以public方式继承Protected_Class_1类  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里仍然保持为a1在这里被转变为protected  
            a2 = 2;//a2在这里仍然保持为a1在这里被转变为protected  
            //a3=3;//错误,由于Base类成员为私有的,即使是上级父类是保护继承,也不能改变Base类成员的控制类型  
        }  
};  
//------------------------------------------------------------------------------  
class Private_Class_1:private Base//私有继承  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1在这里被转变为private  
            a2 = 2;//a2在这里被转变为private  
            //a3=3;//错误,基类私有成员一样是不可访问的  
        }  
};  
class Private_Class_2:public Private_Class_1//以public方式继承Private_Class_1类  
{  
    public:  
        void test()  
        {  
            //a1=1;//错误,由于基类Private_Class_1为私有继承,a1已经转变为private  
            //a2=2;//错误,由于基类Private_Class_1为私有继承,a1已经转变为private  
            //a3=3;//错误,由于Base类成员为私有的,Private_Class_1类也为私有继承  
        }  
};  
//------------------------------------------------------------------------------  
class Public_Class_1:public Base//共有继承有区别与其它方式的继承,继承后的各成员不会其改变控制方式  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//错误,派生类不能操作基类的私有成员  
        }  
};  
class Public_Class_2:public Public_Class_1//以public方式继承Public_Class_1类  
{  
    public:  
        void test()  
        {  
            a1 = 1;//a1仍然保持public  
            a2 = 2;//a2仍然保持protected  
            //a3=3;//错误,由于Base类成员为私有成员,即使是上级父类是公有继承,也不能改变Base类成员的控制类型  
        }  
}; 

 

 

 

  

转载于:https://www.cnblogs.com/bigshowxin/p/4374002.html

你可能感兴趣的文章
调试是新建数据中心成功运营的关键
查看>>
雅虎证实5亿账户被窃 刷新单一网站用户信息泄露纪录
查看>>
科学家警告:被黑客入侵的工业机器人可能将人类生命置于危险中
查看>>
你的电脑会感染勒索病毒吗?快用这款工具查一下
查看>>
村路安防建设加速 科学推进安全前行
查看>>
“业务为王”时代下,DevOps怎么玩?
查看>>
2017技术趋势:最受欢迎的几大工具
查看>>
*ST京蓝入股力合节能 着力绿色智慧城市服务
查看>>
缺陷上报统一模板及缺陷管理流程
查看>>
手机视频监控系统在智能家居中的应用
查看>>
Google AI子公司采用区块链技术来跟踪英国的健康数据
查看>>
力成科技股东会决议通过紫光投资案
查看>>
推荐10款免费的在线UI测试工具
查看>>
《嵌入式系统数字视频处理权威指南》—— 导读
查看>>
侵犯公民个人信息: “两高”首次出台司法解释 打击大数据征信乱象
查看>>
《Photoshop修色圣典(第5版)》—第1章1.13节你将是裁判
查看>>
《大数据算法》一2.4 数组有序的判定算法
查看>>
我的友情链接
查看>>
Option parsing
查看>>
学生信息管理系统
查看>>