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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索继承
, 错误
, 无法访问私有成员
, public
, 类的继承
, protected
, 类继承
, 继承textviewclassandroidjava
, 继承ocdelegate
, springtomcat继承
, 私有
, 私有类
, 成员
方式
java继承访问权限、java继承降低访问权限、c 继承 访问权限、thinkphp 继承控制器、thinkphp5 控制器继承,以便于您获取更多的相关知识。

时间: 2024-08-28 11:52:18

C++类的继承与多重继承的访问控制的相关文章

c++-C++自己写的虚基类和同名函数多重继承的小例子出现了继承不明确的问题

问题描述 C++自己写的虚基类和同名函数多重继承的小例子出现了继承不明确的问题 #include using namespace std; class vihicle { public: int i; virtual void run() { cout<<"111"; } }; class bicycle:virtual public vihicle { public: void run() { cout<<"bicycle run"; }

Lua实现类与继承的实例详解

Lua中没有类的概念,但可以通过table.函数以及一些语言特性来模拟类.table的值可以为函数.看下面这段代码: LogUtil = {msg_prefix = string.format("%s ", os.date("%H:%M:%S", os.time())) } LogUtil.write = function(msg)     print(LogUtil.msg_prefix .. msg .. "\r\n") end   LogU

JS原型继承和类式继承

类式继承(构造函数) JS中其实是没有类的概念的,所谓的类也是模拟出来的.特别是当我们是用new 关键字的时候,就使得"类"的概念就越像其他语言中的类了.类式继承是在函数对象内调用父类的构造函数,使得自身获得父类的方法和属性.call和apply方法为类式继承提供了支持.通过改变this的作用环境,使得子类本身具有父类的各种属性.   var father = function() { this.age = 52; this.say = function() { alert('hell

类的继承(Inheritance)

vb.net支持类的继承,允许用户定义一个类,作为其他类继承的依据,继承类能够继承.扩充基本类的属性和方法,继承类也可以重载基本类的一些方法,所有在Vb.net中建立的类缺省的属性都是可继承的.因为窗体现在看成了一个类,所以在vb.net中用户可以根据现有的窗体继承出一个新的窗体. 继承的一个目的就是使代码可以重用.有两种方法可以提高代码的重用率,合成(composition)和继承(Inheritance),一直以来,Visual Basic都支持合成这种方法来达到代码的重用,用户可以建立和重

JavaScript设计模式学习之“类式继承”

 这篇文章主要介绍了JavaScript设计模式学习之"类式继承",本文直接用代码实例讲解类式继承的实现方法,需要的朋友可以参考下     在做一件事情之前,首先要清楚做这件事情的好处有什么,相信不会有哪个人愿意无缘无故的去做事情.一般说来,我们在设计类的时候,实际上就是希望能减少重复性的代码,使用继承可以完美的做到这一点,借助继承机制,你可以在现有类的基础上再次进行设计并且充分利用它们已经具备的各种方法,而对设计的修改也更为轻松.废话不多说了,举例说明: 代码如下: function

对象-oc 类的继承的实质,以及是怎样调用方法 和函数的

问题描述 oc 类的继承的实质,以及是怎样调用方法 和函数的 父类里声明的属性,会生成默认生成一个私有的成员变量.即不能被子类访问,那么子类通过继承得到了父类的属性,只能通过setter 和 getter 方法区访问父类的私有变量,那么这个私有变量不属于子类,那么在实例化这个子类的时候就没有这个私有变量,那么通过继承过来的setter 和getter方法访问的是什么,私有变量根本就没有生成啊! 同理在使用{}声明的私有变量同样可以在提供外部接口让外部访问,但是当子类继承后也可以通过生成实例对象,

obj-c编程04:类的继承

    这第4篇内容比较少,主要说的是obj-c中的类的继承,需要说明的是我只是写了继承中最简单的形式,如果全部展开来说,那就多了去了!关键是现在肚子里还没装够墨水,没法展开啊!     下面的代码中,我们写了2个类:父类A和子类B,然后B中对A中的方法做了重写. #import <Foundation/Foundation.h> @interface A:NSObject{ int i; } @property int i; -(void)print; @end @implementatio

java类的问题-java编程,有关类的继承,方法的覆盖等

问题描述 java编程,有关类的继承,方法的覆盖等 类Citizen,拥有identityCardNumber(String).name(String).gender(char).birthPlace(String).birthday(java.util.Date)属性,构造方法Citizen(String identityCardNumber, String name, char gender).Citizen(String identityCardNumber, String name, c

JPanel继承问题... 写了一个类,继承自JPanel,但是控件不显示,跪求求各位大牛...

问题描述 JPanel继承问题... 写了一个类,继承自JPanel,但是控件不显示,跪求求各位大牛... 在做一个世界各个国家的时间的一个Demo.写了一个继承自JPanel类的panel,里面简单的设置了一个Logo,国家名字,还有一个按秒跳动时间,现在的问题就是在这个panel上的控件都不显示了,调了好久了也没有找到原因,所以没办法了,特来求助各位大牛们..... 话不多说,直接贴代码: package timerDemo; import java.awt.BorderLayout; im