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成员不但对应用程序隐藏,即使是派生类也是隐藏不可访问的,而基类的保护成员只对应用程序隐藏,对于派生类来说是不隐藏的,保护继承与私有继承在实际编程工作中使用是极其少见的,他们只在技术理论上有意义。

 
 

《挑战30天C++入门极限》C++类的继承与多重继承的访问控制的更多相关文章

  1. 《挑战30天C++入门极限》类的分解,抽象类与纯虚函数的需要性

        类的分解,抽象类与纯虚函数的需要性 为了不模糊概念在这里我们就简单的阐述一下类的分解,前面的教程我们着重讲述了类的继承,继承的特点就是,派生类继承基类的特性,进行//站点:www.cndev- ...

  2. 《挑战30天C++入门极限》图文例解C++类的多重继承与虚拟继承

        图文例解C++类的多重继承与虚拟继承 在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念 ...

  3. 《挑战30天C++入门极限》C++的iostream标准库介绍(1)

        C++的iostream标准库介绍(1) 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同 ...

  4. 《挑战30天C++入门极限》图例实解:C++中类的继承特性

        图例实解:C++中类的继承特性 整个c++程序设计全面围绕面向对象的方式进行,类的继承特性是c++的一个非常非常重要的机制,继承特性可以使一个新类获得其父类的操作和数据结构,程序员只需在新类中 ...

  5. 《挑战30天C++入门极限》C++类静态数据成员与类静态成员函数

        C++类静态数据成员与类静态成员函数 在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? ...

  6. 《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数

        C++类对象的复制-拷贝构造函数 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int ...

  7. 《挑战30天C++入门极限》C++面向对象编程入门:类(class)

        C++面向对象编程入门:类(class) 上两篇内容我们着重说了结构体相关知识的操作. 以后的内容我们将逐步完全以c++作为主体了,这也意味着我们的教程正式进入面向对象的编程了. 前面的教程我 ...

  8. 《挑战30天C++入门极限》入门教程:实例详解C++友元

        入门教程:实例详解C++友元 在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点: 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为pu ...

  9. 《挑战30天C++入门极限》C++面向对象编程入门:构造函数与析构函数

        C++面向对象编程入门:构造函数与析构函数 请注意,这一节内容是c++的重点,要特别注意! 我们先说一下什么是构造函数. 上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们 ...

随机推荐

  1. java之hibernate之session中对象的生命周期

    1. session是用来执行对象的crud操作,并且session是对象事务工厂.session是线程级别的,所以生命周期比较短. 2.session中对象的生命周期图: 3.session中对象的 ...

  2. ASP.NET Core 入门(2)(WebApi接口请求日志 Request和Response)

    以前 .NET Framework WebApi 记录接口访问日志,一般是通过Filter的方式进行拦截,通过重写ActionFilterAttribute的OnActionExecuting实现拦截 ...

  3. Coldfusion Sql查询分组输出

    <cfoutput query="myQry" group="date"> #date# <cfoutput> #detail# < ...

  4. JavaScript的深浅复制

    JavaScript的深浅复制 为什么有深复制.浅复制? JavaScript中有两种数据类型,基本数据类型如undefined.null.boolean.number.string,另一类是Obje ...

  5. iOS学习之字符串(NSString)的截取、匹配、分隔

    截取 NSString *str1 = @"this is zero"; 1.从第三个字符开始,截取长度为2的字符串.........注:空格算作一个字符 NSString *st ...

  6. Ubuntu安装KScope

    命令安装 # apt-get install kscope 1. 编译安装 # tar xvf kscope-1.9.4.tar.gz # cd kscope-1.9.4 # qmake # make ...

  7. SpringBoot中LocalDatetime作为参数和返回值的序列化问题

    欢迎访问我的个人网站 https://www.zhoutao123.com 本文原文地址 https://www.zhoutao123.com/#/blog/article/59 LocalDatet ...

  8. EasyUI DataGrid 根据ID选中行(转载)

      转载来源: https://blog.csdn.net/chq00788/article/details/51505519 function selectRows(){ //获取需要选中的记录ID ...

  9. 修改Mysql 字符集,支持Emoji表情

    插入失败 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at ...

  10. three.js展示三维模型

    1.概要 最近学习Three.js,尝试加载一些3d max导出的obj.stl模型,在展示模型的时候遇到了一些问题,模型的尺寸.位置和旋转角度每次都靠手工调整,非常的不方便,就想着写一个方法来随心所 ...