C++类的继承与多重继承的访问控制

  在前面的练习中我们一直在使用public的继承方式,即共有继承方式,对于protected和private继承方式,即保护继承私有继承方式我们并没有讨论。

 对于单个类来说,讨论保护继承与私有继承的区别意义是不大的,他们的区别只在多级继承的情况中体现。

  在这里我声明一下,对于此章节的内容不太适合用过多的文字进行描述,主要还是看例子,通过例子熟悉之间的关系,过多的文字描述会模糊读者思路。

  例程如下(重要部分都做了详细说明):

//程序作者:管宁   
//站点:www.cndev-lab.com   
//所有稿件均有版权,如要转载,请务必著名出处和作者   
 
#include <iostream> 
using namespace std; 
 
class Base 


    public://公有的 

        int a1; 
        virtual void test() = 0; 
    protected://受保护的 
        int a2; 

    private://私有的 

        int a3; 
}; 
//------------------------------------------------------------------------------ 

class ProtectedClass:protected Base//保护继承 


    public: 
        void test() 
        { 
            a1 = 1;//a1在这里被转变为protected 

            a2 = 2;//a2在这里被转变为protected 
            //a3=3;//错误,派生类不能访问基类的私有成员 
        } 
}; 
class ControlProtectedClass:public ProtectedClass//以public方式继承ProtectedClass类 

    public: 
        void test() 

        { 
            a1 = 1;//a1在这里仍然保持为a1在这里被转变为protected 
            a2 = 2;//a2在这里仍然保持为a1在这里被转变为protected 

            //a3=3;//错误,由于Base类成员为私有的,即使是上级父类是保护继承,也不能改变Base类成员的控制类型 

        } 
}; 
//------------------------------------------------------------------------------ 

class PrivateClass:private Base//私有继承 


    public: 
        void test() 
        { 
            a1 = 1;//a1在这里被转变为private 

            a2 = 2;//a2在这里被转变为private 
            //a3=3;//错误,基类私有成员对文件区域与派生类区域都是不可访问的 
        } 
}; 

class ControlPrivateClass:public PrivateClass//以public方式继承PrivateClass类 

    public: 
        void test() 

        { 
            //a1=1;//错误,由于基类PrivateClass为私有继承,a1已经转变为private 

            //a2=2;//错误,由于基类PrivateClass为私有继承,a1已经转变为private 

            //a3=3;//错误,由于Base类成员为私有的,PrivateClass类也为私有继承 
        } 

}; 
//------------------------------------------------------------------------------ 

class PublicClass:public Base//共有继承有区别与其它方式的继承,继承后的各成员不会其改变控制方式 

    public: 
        void test() 

        { 
            a1 = 1;//a1仍然保持public 
            a2 = 2;//a2仍然保持protected 

            //a3=3;//错误,派生类不能操作基类的私有成员 

        } 
}; 
class ControlPublicClass:public PublicClass//以public方式继承PublicClass类 

    public: 
        void test() 

        { 
            a1 = 1;//a1仍然保持public 
            a2 = 2;//a2仍然保持protected 

            //a3=3;//错误,由于Base类成员为私有成员,即使是上级父类是公有继承,也不能改变Base类成员的控制类型 

        } 
}; 
//------------------------------------------------------------------------------ 

int main() 


    system("pause");  
}

  认真看完了例子,相信细心的读者对于共有继承、保护继承与私有继承的区别与特点已经了解,最后再提醒一下读者,在继承关系中,基类的private成员不但对应用程序隐藏,即使是派生类也是隐藏不可访问的,而基类的保护成员只对应用程序隐藏,对于派生类来说是不隐藏的,保护继承与私有继承在实际编程工作中使用是极其少见的,他们只在技术理论上有意义。

 
 

最新文章

  1. angular 自定义指令 directive transclude 理解
  2. 号外号外:9月21号关于Speed-BI 《全国人口统计数据分析》开讲了
  3. Query 快速入门教程
  4. php开启新的进程或者线程
  5. 关于原生AJAX和jQueryAJAX的编程
  6. java二维不定长数组测试
  7. WAS
  8. Android提高第二篇之SurfaceView的基本使用
  9. adb连接手机报错解决方案汇总(win7)
  10. Android服务器——使用TomCat实现软件的版本检测,升级,以及下载更新进度!
  11. 【Tomcat】Tomcat配置JVM参数步骤
  12. git删除掉已经保存的用户名密码
  13. checkout 多选 全选(亲测有效)
  14. 修改phpcms默认分页样式
  15. mysql 5.7.12----bin/mysqld --initialize --user=mysql出错
  16. Java ActiveMQ 讲解(一)理解JMS 和 ActiveMQ基本使用
  17. 学习使用 ARM 的 math 库,据说 速度比C标准库 自带的 快 几十倍 到几百倍
  18. mac下谷歌chrome浏览器的快捷键
  19. ComBox绑定枚举
  20. JFinal自定义FreeMarker标签

热门文章

  1. JavaNetty
  2. node-red 流程的导入导出
  3. vue刷新页面出现闪烁
  4. MSMQ消息加密
  5. Python接口自动化基础---get请求
  6. python-django中的APPEND_SLASH实现
  7. 设置yum自动更新
  8. SQL SERVER-Extendevent系统视图
  9. three.js展示三维模型
  10. idea中添加web.xml配置文件与tomcat启动中遇到的web.xml文件找不到的问题