c++ 成员可见性

在C++语言中,一个 派生类可以从一个 基类派生,也可以从多个基类派生。从一个 基类派生的继承称为单继承;从多个基类派生的继承称为 多继承
派生类的定义格式
单继承的定义格式如下:
class <派生类名>:<继承方式><基类名>
{
<派生类新定义成员>
};
其中,class是关键词,<派生类名>是新定义的一个类的名字,它是从<基类名>中派生的,并且按指定的<继承方式>派生的。<继承方式>常使用如下三种关键字给予表示:
public 表示公有 基类
private 表示私有 基类
protected 表示保护 基类
多继承的定义格式如下:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类新定义成员>
};
可见, 多继承与单继承的区别从定义格式上看,主要是多继承的 基类多于一个。
如果省略继承方式,对'class'将采用 私有继承,对'struct'将采用公有继承。
也就是说
class Base1{};
struct Base2{};
class Derive:Base1,Base2{};
那么,Derive类将 私有继承Base1,公有继承Base2。相当于:
class Derive:private Base1,public Base2{};

2继承方式

公有继承(public)、 私有继承(private)、保护继承(protected)是常用的三种继承方式。
1. 公有继承(public)
公有继承的特点是 基类的公有成员和保护成员作为 派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
2.  私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为 派生类的私有成员,并且不能被这个派生类的子类所访问。
3. 保护继承(protected)
保护继承的特点是 基类的所有公有成员和保护成员都成为 派生类的保护成员,并且只能被它的派生类成员函数或 友元访问,基类的私有成员仍然是私有的。
下面列出三种不同的继承方式的基类特性和 派生类特性。
 
public
protected
private
公有继承
public
protected
不可见
私有继承
private
private
不可见
保护继承
protected
protected
不可见
为了进一步理解三种不同的继承方式在其成员的可见性方面的区别,下面从三种不同角度进行讨论。

公有方式

(1)  基类成员对其对象的可见性:
公有成员可见,其他不可见。这里保护成员同于私有成员。
(2)  基类成员对 派生类的可见性:
公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。
(3)  基类成员对 派生类对象的可见性:
公有成员可见,其他成员不可见。
所以,在公有继承时, 派生类的对象可以访问 基类中的公有成员; 派生类的成员函数可以访问基类中的公有成员和保护成员。这里,一定要区分清楚 派生类的对象和 派生类中的成员函数对 基类的访问是不同的。

私有方式

(1) 基类成员对其对象的可见性:
公有成员可见,其他成员不可见。
(2) 基类成员对派生类的可见性:
公有成员和保护成员是可见的,而私有成员是不可见的。
(3) 基类成员对派生类对象的可见性:
所有成员都是不可见的。
所以,在 私有继承时,基类的成员只能由 派生类中的成员函数访问,而且无法再往下继承。

保护方式

这种继承方式与 私有继承方式的情况相同。两者的区别仅在于对 派生类的成员而言,对基类成员有不同的可见性。
上述所说的可见性也就是可访问性。关于可访问性还有另的一种说法。这种规则中,称 派生类的对象对 基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问。

3一般规则

公有继承时,水平访问和垂直访问对 基类中的公有成员不受限制;
私有继承时,水平访问和垂直访问对 基类中的公有成员也不能访问;
保护继承时,对于垂直访问同于公有继承,对于水平访问同于 私有继承
对于 基类中的私有成员,只能被基类中的成员函数和 友元函数所访问,不能被其他的函数访问。
基类与 派生类的关系
任何一个类都可以派生出一个新类, 派生类也可以再派生出新类,因此,基类和派生类是相对而言的。

4两类关系

具体化

类的层次通常反映了客观世界中某种真实的模型。在这种情况下,不难看出:基类是对若干个 派生类的抽象,而派生类是基类的具体化。基类抽取了它的 派生类的公共特征,而派生类通过增加行为将 抽象类变为某种有用的类型。

延续化

先定义一个抽象基类,该基类中有些操作并未实现。然后定义非抽象的 派生类,实现抽象基类中定义的操作。例如, 虚函数就属此类情况。这时, 派生类是抽象的基类的实现,即可看成是基类定义的延续。这也是 派生类的一种常用方法。

派生类

多继承时,一个 派生类有多于一个的基类,这时派生类将是所有基类行为的组合。
派生类将其本身与基类区别开来的方法是添加 数据成员和成员函数。因此,继承的机制将使得在创建新类时,只需说明新类与已有类的区别,从而大量原有的程序代码都可以复用,所以有人称类是“可复用的软件 构件”。

5成员调整

控制方式

访问声明采用作用域" ::" ,它的一般形式为:基类名 ::成员名;。在 派生类的类界面中,将这些访问声明放在合适的访问控制保留字之后,从而改变在派生类中该成员的访问控制方式。

重定义

如果在 派生类中定义了一个函数原型与继承成员函数一模一样的成员函数,则该函数实现的 函数体是对继承成员函数的重定义。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值