大家好
欢迎回来继续学习
C++语言程序设计
私有继承呢
是最严格的一种继承
基类的公有和保护成员
继承过来以后呢
都变成了私有成员了
那么基类中的原来私有成员
当然还是不可以直接访问
那这种继承呢
其实用得不多
用的时候呢
你要明确目标
为什么要私有继承
实际上它起到了一个
将基类的原有对外接口
都给它封闭掉的这样一个作用
那么基类继承过来的成员
在派生类之外
通过派生类的对象
就不能直接访问了
那么基类继承过来的公有
和保护成员呢
在派生类的内部
还可以访问
接下来呢
我给大家演示一个
私有继承的例子
在这个例子中呢
我们还是定义一个点类
然后让矩形类继承点类
只不过呢这一次
我们让矩形类
以私有方式来继承点类
然后还是在主函数中
定义矩形类的对象
通过矩形类的对象呢
去调用它的成员函数
这一次看看
调用的是哪个类定义的成员函数
好 我们通过单步执行跟踪进去
看看现在调用的移动
是哪个函数
我们跟踪进去
我们看是进到了
Rectangle的成员函数中
在这个例题中
我们看到
在Rectangle类里面
自己也定义了一个move函数
为什么呢
因为point类的move函数
被继承到Rectangle类以后
就成了私有的了
因为它是私有继承
私有成员函数呢
在类外通过对象
是不能直接调用的
那么我们去
怎么去移动一个矩形呢
虽然私有的成员函数
在类外不能被调用
但是在类体里面
在类的成员函数里面
我们是可以使用它的
所以呢
在这儿我们通过
基类类名和作用域分辨符
在这里调用从基类继承过来的
这个move函数
也就是点类的move函数
这样就达到了
移动矩形的这样一个目的
同样呢
getX getY函数也是一样的
我们继续运行
接下来我们需要进到
这些get函数里面了
第一次还是进到
自己定义的Rectangle定义的
getH函数里面了
执行完了以后
再执行进入到
Rectangle自己定义的getW
函数里面了
接下来呢
进到了getY函数里面
这一次是Rectangle自己定义的
因为基类继承过来了getY
在类外也不能直接被访问了
但是在本类的成员函数中
它是可以访问的
所以呢
在Rectangle的getY函数中
调用了point类继承过来的
这个getY函数
取得了Y坐标的值 返回
同样
getX函数也是一样
调用了Rectangle类
自己定义的getX函数
那么通过这个例子我们就看到了
以私有方式继承的时候
公有成员
到了派生类中也成了私有的
在类外不能直接访问了
这样派生类呢就要解决
必要的这种访问接口的问题
所以Rectangle类
自己定义了一些新的访问接口
那么在函数体中
调用了基类继承过来的函数
保护继承呢
是介于公有和私有之间的一种
继承方式
从第四章开始
大家就一直存着一个疑问
保护成员到底是什么
那么保护继承的时候
基类的公有成员和保护成员
到了派生类以后
都成保护成员了
这个保护成员它的特点就是
派生类中的成员函数
是可以直接访问它的
那么基类的保护成员
到了派生类以后
还是保护成员
大家看到了
不管公有继承还是保护继承
都是基类的保护成员
到了派生类中
还是保护成员
那么也就是说
这个保护成员
它向下派生的时候
是可以被派生类成员
直接访问的
但是在类外呢
在整个类家族之外呢
它就像私有成员一样
是不能被访问的
这就是保护成员的特点
所以经过保护继承以后
在类外通过派生类的对象
就不能访问那些
从基类继承过来的成员了
只能派生类新增的成员
保护成员的特点呢
我们简单归纳一下
对于建立其所在类
对象的模块来说
它与私有成员的性质相同
对于它的派生类来说
它与公有成员的性质相同
既实现了数据隐藏
又方便继承
实现了代码的重用
下面的例题呢
对比了从不同的位置
访问保护成员时候的情况
我们看这里定义了一个类a
其中有一个保护成员x
那这个x在类外能不能访问呢
我们测试一下
定义一个主函数
在主函数中
定义一个A类的对象a
我们试图用a.x的方式
去访问对象A的保护成员
这个时候编译器会给我们报错
因为保护成员在类外去看它
就像私有的一样
它是不可直接访问的
但是呢
如果我们定义一个B
作为派生类去继承A类
用公有的方式继承A类
那么A的类的保护成员
就被继承到B类里面来了
这个时候
我们在B类的成员函数中
直接访问这个保护成员x
这就是可以的
就是正确的
所以保护成员呢
当它以公有方式和保护方式
继承到派生类中以后
派生类的成员函数
是可以访问它的
但是在类外是不可访问
这就是保护成员它的特点
大家看到了
这样的保护成员语法以后
是不是感觉保护成员挺好
它既然能够对于类家族之外
隐藏细节
又能够让这个成员
能被派生类访问
两全其美
是不是很好呢
其实保护成员呢有它的优势
但是也要慎用
用在什么场合可以呢
如果基类和派生类
都是我们自己写的
我们这一个项目
一个团队自己写的
这没有问题
如果说
基类和派生类
不是同一组人写的
或者你干脆是通过某种途径
去买的类库等等
那么那个时候
你去用它的保护成员的细节
就不那么方便了
这个深入的东西
大家可以自己想一想
是不是这么回事
如果派生类有多个基类
也就是多继承的时候
那么每个基类
我们可以采用不同的继承方式
先来看看这个例题
在这里我们定义了A类和B类
定义了C类呢
继承了A和B
它继承两个类
它是以公有方式继承A
以私有方式继承B
A类和B类各自有自己的数据成员
和相应的公有访问接口
它的公有成员函数
C类也自己新增了数据成员
除了继承以外
然后也定义了自己的成员函数
那么我们来看
C类的成员函数
setC它的实现
这些函数是为了给数据成员
设置值
但是它直接设置
直接赋值
只能给自己类新增的
这个成员c赋值
那么从A类继承来的成员
从B类继承来的成员
都要调用C类的公有成员函数
来进行设置
在主函数中
我们定义了C类的对象 obj
那么这个对象
通过这个对象调用setA
showA没有问题
A类的公有成员
被继承到C类中来
仍然是公有成员
调用C类自己新增的公有成员
setC showC也没有问题
但是如果你试图调用
B类的成员函数
那编译器就会给我们报错
为什么呢
因为B类是私有继承的
B类的函数
公有函数到了C里面
也变成私有的了
在类外就不能直接访问了