类的继承与派生(二)

4.派生类成员的访问属性

讨论访问属性时,一般考虑以下几种情况

1.基类成员函数访问基类成员。(ok)

2.派生类的成员函数访问派生类自己增加的成员。(ok)

3.基类的成员函数访问派生类的成员(no)

4.派生类的成员函数访问基类的成员

5.派生类外访问派生类的成员(根据公有成员或者私有成员来定)

6.在派生类外访问基类成员

不同的继承方式决定了基类成员在派生类中的访问属性

(1)公用继承

基类的公有成员和保护成员在派生类中保持原有的访问属性,其私有成员仍为基类私有(基类私有的意思是是基类的私有成员但不是子类的私有成员)。

(2)私有继承

基类的公有成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。

(3)受保护的继承

基类的公有成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。

4.1公用继承

定义:在定义一个继承类时将基类的继承方式指定为public的,称为公用继承,用公用继承方式建立的派生类称为公用派生类,其基类称为公用基类

在基类的访问属性 在派生类中的访问属性
private(私有) 不可访问
public(公用) public(公用)
proctected(保护) protected(保护)

虽然是公用继承,但仍然不可以访问基类的私有成员。这是体现了数据的封装性。故保护私有成员是一条重要的原则。

访问公用基类的成员:

对于公用基类的私有成员,只能通过调用基类的公有成员函数进行访问基类的私有成员。

4.2私有继承

在声明一个派生类时将基类的继承方式指定为private的,称为私有继承,用私有继承方式建立的派生类称为私有派生类,其基类称为私有基类

私有基类在派生类中访问属性

在基类的访问属性 在派生类中的访问属性
private 不可访问    
public 私有
protected 私有

对于不需要再往下继承的类的功能可以用私有继承方式把它隐藏起来,这样下一层的派生类无法访问它的任何成员。(公有函数变为私有函数,私有函数再往下继承便不可访问)

可以知道:一个成员在不同的派生层次中的访问属性可能是不同的,它与继承方式有关。

(注:可以利用私有派生类中的公有成员函数调用私有基类中的公有成员函数,从而访问私有基类中的私有成员)。

注:私有派生类的限制过多,一般不经常使用。

4.3 保护成员与保护继承

保护成员:有'protected'声明的成员称为“受保护的成员”,或简称“保护成员”。从类的用户角度考虑,保护成员等价于私有成员。但有一点与私有成员不同,保护成员可以被派生类的成员函数引用。如果在一个类中声明了保护成员,就意味着该类可能要用做基类,在它的派生类中会访问这些成员。

在定义一个派生类时将基类的继承方式指定为protected的,称为保护继承,用保护继承方式建立的派生类叫做保护派生类,其基类称为受保护的基类,简称保护基类

在基类中的访问属性 在派生类中的访问属性
private 不可访问
public protected
protected protected

分析:

(1)保护基类的所有成员在在派生类中都被保护起来,类外不能访问,其公用成员和保护成员可以被其派生类的成员函数访问,私有成员则不可以被访问。

(2)比较一下私有继承和保护继承:

在直接继承类中,两种继承方式的作用是相同的。但如果继续派生,则两种继承方式的作用不相同。

(3)如果需要在派生类中引用基类某些成员,应当在基类中的这些成员声明为protected,而不要声明为private。

(4)在派生类中,成员有四种不同的访问属性

公用的,受保护的,私有的,不可访问的

(5)类的成员在不同作用域中有不同的访问属性。

如何访问保护成员:

通过派生类的成员函数进行访问。

4.4多级派生时的访问属性

在多级派生的情况下,各成员的访问属性仍按以上原则确定。

如果多级派生都采用公有继承方式,那么直到最后一级派生类都能访问基类的公用成员和保护成员。如果采用私有继承,经过若干次派生后,基类的所有成员已经变成不可访问的。如果采用保护继承,很难分清哪些成员可以访问,哪些成员不可以访问。

因此,在实际中,常用的是公用继承。

猜你喜欢

转载自blog.csdn.net/xutian_curry/article/details/80468138