【和春笋一起学C++】(七十)私有继承与保护继承 📅 2026/7/12 23:31:46 目录1 私有继承1.1 使用私有继承还是包含2 保护继承3 保护继承和私有继承的区别1 私有继承C中实现has-a关系的机制除了包含还可以使用私有继承。使用私有继承基类的公有成员和保护成员都将成为派生类的私有成员即基类方法不会成为派生类公有接口的一部分但可以在派生类的成员函数中使用。使用公有继承时基类的公有方法将成为派生类的公有方法派生类将继承基类的接口。使用私有继承时基类的公有方法将成为派生类的私有方法派生类不继承基类方法的接口但可以在派生类方法中使用基类方法。包含是将对象作为一个命名的成员对象添加到类中而私有继承是将对象作为一个未被命名的继承对象添加到类中。使用术语子对象来表示通过继承或包含添加的对象。要使用私有继承需使用关键字private而不是public来定义类private是默认值如果省略访问限定符将导致私有继承。下面使用私有继承的方式定义上篇文章《包含对象成员的类》中的Student类。由于Student类中用到了两个类string和valarraydouble因此需要从两个类中派生定义如下class Student:private string, private valarraydouble { public: ... };说明使用多个基类的继承被称为多重继承。新的Student类不需要私有数据因为两个基类已经提供了所需的所有数据成员。1.1 使用私有继承还是包含建立has-a关系既可以用包含也可以用私有继承那应该使用何种方式呢通常情况下使用包含更好。首先它易于理解。类声明中包含表示被包含类的显式命名对象代码可以通过名称引用这些对象而使用继承将使关系更抽象。其次继承会引起许多问题尤其是从多个基类继承时可能必须处理许多问题如包含同名方法的独立基类。另外包含能够包括多个同类的子对象如果某个类需要3个string可以使用包含声明3个独立的string成员而继承只能使用一个这样的对象。但使用私有继承所提供的特性比包含多。例如当类中含有保护成员时该保护成员在派生类中是可用的如果使用了包含机制将该类包含在在另一个类中则将不能访问保护成员。但是通过继承得到的是派生类它能够访问保护成员。另一种需要使用私有继承的情况是需要重新定义虚函数。派生类可以重新定义虚函数但包含类不能。使用私有继承重新定义的函数只能在类中使用它不是公有的。通常应使用包含来建立has-a关系。如果新类需要访问原有类的保护成员或需要重新定义虚函数则应使用私有继承。2 保护继承保护继承是私有继承的变体保护继承在列出基类时使用关键字protected:class Student:protected string, protected valarraydouble { public: ... };使用保护继承时基类的公有成员和保护成员都将成为派生类的保护成员。和私有继承一样基类接口在派生类中是可用的但在类外是不可用的。3 保护继承和私有继承的区别保护继承和私有继承的主要区别在第三代类如下图所示在第三代类中如果派生类是使用保护继承派生的则在第三代类中可以使用基类方法的接口如果派生类是使用私有继承方式派生的则在第三代类中无法使用基类方法的接口。下表总结了公有继承私有继承以及保护继承之间的关系。