c++中公有继承和私有继承的区别
在C++中,公有继承(public inheritance)和私有继承(private inheritance)是两种不同的继承方式,它们在访问权限和派生类与基类之间的关系上有所不同。以下是它们的详细说明:
公有继承(Public Inheritance):
-
访问权限:
- 基类的公有成员在派生类中保持为公有(public)成员。
- 基类的受保护成员在派生类中保持为受保护(protected)成员。
- 基类的私有成员在派生类中不可访问。
-
派生类对基类成员的访问:
- 派生类可以直接访问基类的公有和受保护成员。
- 派生类不能直接访问基类的私有成员。
-
派生类对外界的接口:
- 派生类可以将从基类继承的公有成员暴露给外界,因为它们保持为公有成员。
-
派生类类型与基类类型的关系:
- 公有继承表示"是一个"关系,即派生类对象可以被视为基类对象,可以用来替代基类对象。
私有继承(Private Inheritance):
-
访问权限:
- 基类的所有成员在派生类中都变为私有成员。
- 基类的公有、受保护和私有成员在派生类中都变为私有成员。
-
派生类对基类成员的访问:
- 派生类可以直接访问基类的所有成员,因为它们都变为了私有成员。
-
派生类对外界的接口:
- 派生类不能将从基类继承的任何成员暴露给外界,因为它们都变为了私有成员。
-
派生类类型与基类类型的关系:
- 私有继承不表示"是一个"关系,派生类对象不能直接替代基类对象,因为对外部来说,派生类对象并不是基类对象。
示例代码:
cpp
class Base {
public:
int publicVar;
protected:
int protectedVar;
private:
int privateVar;
};
// 公有继承
class DerivedPublic : public Base {
// DerivedPublic 从 Base 继承了 publicVar 和 protectedVar
// privateVar 在 DerivedPublic 中不可访问
};
// 私有继承
class DerivedPrivate : private Base {
// DerivedPrivate 从 Base 继承了 publicVar、protectedVar 和 privateVar
// 但它们在 DerivedPrivate 中都变为了私有成员
};
int main() {
DerivedPublic objPublic;
objPublic.publicVar = 10; // 合法,因为 publicVar 是公有成员
objPublic.protectedVar = 20; // 合法,因为 protectedVar 是受保护成员
DerivedPrivate objPrivate;
objPrivate.publicVar = 10; // 非法,因为 publicVar 在 DerivedPrivate 中是私有成员
objPrivate.protectedVar = 20; // 非法,因为 protectedVar 在 DerivedPrivate 中是私有成员
return 0;
}