保护继承是私有继承的变体:
使用保护继承时,基类的公有成员和保护成员都将成为派生类的保护成员。和私有继承一样,基类的接口在派生类中也是可用的,但是在继承结构之外是不可用的。
当从派生类派生出另一个类时,私有继承和保护继承之间的主要区别就呈现出来了。使用私有继承,第三代类不能使用基类的接口,这是因为基类的公有方法在派生类中变成了私有方法;使用保护继承,基类的公有方法在第二代中将变成受保护的,因此第三代类可以使用他们。
class Student :protected string, protected std::valarray<double>
{
...
};
各种继承方式:
特征 | 公有继承 | 保护继承 | 私有继承 |
---|---|---|---|
公有成员变成 | 派生类的公有成员 | 派生类的保护成员 | 派生类的私有成员 |
保护成员变成 | 派生类的保护成员 | 派生类的保护成员 | 派生类的私有成员 |
私有成员变成 | 只能通过基类的接口访问 | 只能通过基类的接口访问 | 只能通过基类的接口访问 |
能否隐式向上转换 | 是 | 是(但只能在派生类中) | 否 |
私有继承和保护继承也使得派生类能够重用基类的代码,但建立的是has-a关系。这两种继承,基类的接口成为派生类的内部接口,派生类对象不能显式地使用基类的接口,不能把派生类对象看作一种基类对象。由于这个原因,在不进行显式类型转换的情况下,基类的指针或引用将不能指向派生类对象。