第15章 面向对象编程(4)
15.2.5 公有、私有和受保护的继承
对类所继承的成员的访问由基类中的成员访问级别和派生类派生列表中使用的访问标号共同控制。
每个类控制它所定义的成员的访问。派生类可以进一步限制但不能放松对所继承的成员的访问。
派生类不能访问基类的private成员,也不能使自己的用户能够访问那些成员。如果基类成员为public或protected,则派生列表中使用的访问标号决定该成员在派生类中的访问级别。
如果是公有继承(public inheritance),基类成员保持自己的访问级别:基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。
如果是受保护继承(protected inheritance),基类的public和protected成员在派生类中为protected成员。
如果是私有继承(private inheritance),基类的所有成员在派生类中为private成员。
class Base{
protected:
int i;
};
class Child1:private Base{
public:
int GetValue(){
return i;
}
};
无论派生列表中是什么访问标号,所有继承Base的类对Base中的成员具有相同的访问。派生访问标号将控制派生类的用户对从Base继承而来的成员的访问。
派生访问标号还控制来自非直接派生类的访问。
1. 接口继承与实现继承
public派生类继承基类的接口,它具有与基类相同的接口。设计良好的类层次中,public派生类的对象可以用在任何需要基类对象的地方。
使用private或protected派生的类不继承基类的接口,相反,这些派生通常被称为实现继承。派生类在实现中使用被继承类但继承基类的部分并未成为其接口的一部分。
迄今为止,最常见的继承形式是public。
2.去除个别成员
如果进行private或protected继承,则基类成员的访问级别在派生类中比在基类中更受限。
派生类可以恢复继承成员的访问级别,但不能使访问级别比基类中原来指定的更严格或更宽松。
class Base{
protected:
int i;
};
class Child1:private Base{
protected:
using Base::i;
public:
int GetValue(){
return i;
}
};
正如可以使用using声明从命名空间使用名字,也可以使用using声明访问基类中的名字,除了在作用域操作符左边用类名字代替命名空间名字之外,使用形式是相同的。
3. 默认继承保护级别
用struct和class保留字定义的类具有不同的默认访问级别,同样默认继承访问级别根据使用那个保留字定义派生类也不相同。使用class保留字定义的派生类默认有private继承,而用struct保留字定义的类默认具有public继承。
struct保留字定义的类与class定义的类唯一的不同只是默认的成员保护级别和默认的派生保护级别,没有其他区别。
尽管私有继承在使用class保留字时时默认情况,但这在实践中相对罕见。因为私有继承是如此罕见,通常显式指定private是比依赖于默认更好的办法。显式指定可清除指出想要私有继承而不是一时疏忽。
摘自 xufei96的专栏
补充:软件开发 , C++ ,