在C++中,基类可以被公有继承(public inheritance)、保护继承(protected inheritance)或私有继承(private inheritance)三种不同的方式继承。这三种继承方式的主要区别在于基类的公有成员和保护成员在派生类中的访问权限。
- 公有继承(public inheritance):
- 基类的公有成员在派生类中保持公有。
- 基类的保护成员在派生类中保持保护。
- 基类的私有成员在派生类中不可访问。
- 保护继承(protected inheritance):
- 基类的公有成员在派生类中变为保护成员。
- 基类的保护成员在派生类中变为保护成员。
- 基类的私有成员在派生类中不可访问。
- 私有继承(private inheritance):
- 基类的公有成员在派生类中变为私有成员。
- 基类的保护成员在派生类中变为私有成员。
- 基类的私有成员在派生类中不可访问。
下面是一个示例,展示了这三种继承方式的区别:
class Base {
public:
int publicData;
protected:
int protectedData;
private:
int privateData;
};
// 公有继承
class PublicDerived : public Base {
public:
void accessBaseMembers() {
publicData = 1; // 正确:公有成员保持公有
protectedData = 2; // 正确:保护成员保持保护
// privateData = 3; // 错误:私有成员不可访问
}
};
// 保护继承
class ProtectedDerived : protected Base {
public:
void accessBaseMembers() {
publicData = 1; // 正确:公有成员变为保护
protectedData = 2; // 正确:保护成员变为保护
// privateData = 3; // 错误:私有成员不可访问
}
};
// 私有继承
class PrivateDerived : private Base {
public:
void accessBaseMembers() {
publicData = 1; // 正确:公有成员变为私有
protectedData = 2; // 正确:保护成员变为私有
// privateData = 3; // 错误:私有成员不可访问
}
};
int main() {
PublicDerived pubDerived;
ProtectedDerived protDerived;
PrivateDerived privDerived;
pubDerived.publicData = 10; // 正确:公有继承的公有成员外部可访问
// protDerived.publicData = 10; // 错误:保护继承的公有成员外部不可访问。即保护成员不可外部访问,只有公有成员可以外部访问
// privDerived.publicData = 10; // 错误:私有继承的公有成员外部不可访问
return 0;
}
在这个例子中,Base
类有三种不同类型的成员:公有、保护和私有。PublicDerived
、ProtectedDerived
和PrivateDerived
分别以公有、保护和私有方式继承自Base
类。可以看到,不同的继承方式影响了基类成员在派生类中的可访问性,以及派生类对象在外部对这些成员的访问能力。
在C++和Java等面向对象的编程语言中,类的成员变量和成员函数可以有不同的访问权限。通常有三种访问权限:
public
:公有的成员可以在类的内部和外部都可以访问。protected
:保护的成员可以在类的内部和其派生类中访问,但不能在类的外部访问。private
:私有的成员只能在类的内部访问,不能在类的外部或派生类中访问。
因此,一个类的保护成员(protected
)确实不可以在类外访问,只有公有成员(public
)对外部代码是可见的。这是面向对象编程中封装性的一个体现,用于隐藏类的内部实现细节,只暴露必要的接口给外部使用。