在C++中,类的继承主要有三种方式:公有继承(public
inheritance)、保护继承(protected
inheritance)和私有继承(private
inheritance)。这些继承方式决定了基类成员在派生类中的访问权限。
公有继承(Public Inheritance)
当使用公有继承时,基类的公有(public
)和保护(protected
)成员在派生类中保持原有的访问权限。也就是说,基类的公有成员在派生类中仍然是公有的,保护成员在派生类中仍然是保护的。但基类的私有(private
)成员在派生类中是不可访问的。
class Base { |
public: |
void PublicFunction() { /* ... */ } |
protected: |
void ProtectedFunction() { /* ... */ } |
private: |
void PrivateFunction() { /* ... */ } |
}; |
class Derived : public Base { |
public: |
void AnotherFunction() { |
PublicFunction(); // 可以调用,因为是公有的 |
ProtectedFunction(); // 可以调用,因为在派生类中保护成员仍然是可访问的 |
// PrivateFunction(); // 错误!不可访问,因为是私有的 |
} |
}; |
保护继承(Protected Inheritance)
当使用保护继承时,基类的公有和保护成员在派生类中都将变成保护的。这意味着这些成员在派生类内部是可访问的,但在派生类外部是不可访问的。基类的私有成员在派生类中仍然是不可访问的。
class Derived : protected Base { |
public: |
void AnotherFunction() { |
PublicFunction(); // 可以调用,因为在派生类中公有成员变成了保护的 |
ProtectedFunction(); // 可以调用,因为本来就是保护的 |
// PrivateFunction(); // 错误!不可访问,因为是私有的 |
} |
}; |
// 在派生类外部 |
Derived d; |
// d.PublicFunction(); // 错误!不可访问,因为在派生类外部它变成了保护的 |
私有继承(Private Inheritance)
当使用私有继承时,基类的所有成员(公有、保护和私有)在派生类中都将变成私有的。这意味着这些成员只能在派生类内部被访问,派生类外部无法访问它们。
class Derived : private Base { |
public: |
void AnotherFunction() { |
PublicFunction(); // 可以调用,因为在派生类中公有成员变成了私有的 |
ProtectedFunction(); // 可以调用,因为在派生类中保护成员变成了私有的 |
// PrivateFunction(); // 错误!不可访问,因为是私有的 |
} |
}; |
// 在派生类外部 |
Derived d; |
// d.PublicFunction(); // 错误!不可访问,因为在派生类外部它变成了私有的 |
继承方式的选择
选择哪种继承方式取决于你希望基类成员在派生类中的可见性和可访问性如何。公有继承是最常见的选择,它保留了基类中公有成员的访问级别。保护继承通常用于当你想让基类的一部分成员在派生类内部可见,但在派生类外部不可见时。私有继承则用于完全隐藏基类的实现细节,只让派生类内部能够使用这些成员。