在 C++ 中,继承的方式有三种:public
、protected
和 private
。它们控制了基类成员在派生类中的访问权限。以下是这三种继承方式的区别:
1. public
继承
- 基类的
public
成员在派生类中保持public
。 - 基类的
protected
成员在派生类中保持protected
。 - 基类的
private
成员在派生类中不可访问。
这种继承方式表示「is-a」的关系,派生类对象可以当作基类对象使用(比如赋值或传递给函数时可以转换为基类类型),适合用于多态性场景。
示例:
struct Base {
public:
int publicVar;
protected:
int protectedVar;
private:
int privateVar;
};
struct Derived : public Base {
void func() {
publicVar = 1; // 可访问
protectedVar = 2; // 可访问
// privateVar = 3; // 不可访问,编译错误
}
};
2. protected
继承
- 基类的
public
和protected
成员在派生类中都变为protected
。 - 基类的
private
成员在派生类中依然不可访问。
这种继承方式通常表示「implemented-in-terms-of」的关系,表示派生类需要使用基类的功能,但不希望外部直接把派生类当作基类使用。
示例:
struct Derived : protected Base {
void func() {
publicVar = 1; // 作为 protected 可访问
protectedVar = 2; // 可访问
}
};
- 在这种继承方式下,即使
publicVar
是基类中的public
成员,在Derived
中也只能作为protected
访问,派生类的对象无法直接访问publicVar
。
3. private
继承
- 基类的
public
和protected
成员在派生类中都变为private
。 - 基类的
private
成员在派生类中依然不可访问。
这种继承方式表示「is-implemented-in-terms-of」的关系,通常用于派生类仅作为内部实现细节,不希望基类的接口直接暴露在派生类接口中。
示例:
struct Derived : private Base {
void func() {
publicVar = 1; // 作为 private 可访问
protectedVar = 2; // 可访问
}
};
- 在这种继承方式下,基类的
public
和protected
成员在派生类中都变成private
,外部无法通过派生类对象访问Base
的publicVar
。
总结
public
继承:派生类对象可以作为基类对象使用,适合多态。protected
继承:限制外部直接使用基类接口,适合仅内部继承实现。private
继承:更严格地封装了基类的接口,使其仅在派生类内部可用。