C++权限对继承的影响
在C++中,继承权限(public、protected、private)决定了基类成员在派生类中的访问级别。继承权限与基类成员的原始访问修饰符共同作用,形成最终的访问规则。
基类成员的原始访问权限
public:成员在类内外均可访问。protected:成员仅在类内和派生类中可访问。private:成员仅在类内可访问,派生类不可见。
继承权限的作用
继承权限会限制派生类对基类成员的访问上限:
-
公有继承(
public) :基类的public和protected成员在派生类中保持原权限。cppclass Base { public: int x; protected: int y; private: int z; }; class Derived : public Base { // x: public, y: protected, z: 不可访问 }; -
保护继承(
protected) :基类的public和protected成员在派生类中均变为protected。cppclass Derived : protected Base { // x: protected, y: protected, z: 不可访问 }; -
私有继承(
private) :基类的public和protected成员在派生类中均变为private。cppclass Derived : private Base { // x: private, y: private, z: 不可访问 };
权限访问规则总结
-
派生类内部:访问权限由继承权限和基类成员的原始权限共同决定。
- 基类的
private成员始终不可访问。 - 继承权限会降低基类
public/protected成员的最高访问级别。
- 基类的
-
派生类外部 :只能通过派生类的对象访问基类的
public成员(仅限公有继承)。cppDerived d; d.x; // 仅当继承为public且x在基类为public时合法 -
多级继承:权限会逐层叠加限制。例如:
- 若
A私有继承B,C公有继承A,则B的成员在C中均为private。
- 若
示例代码
cpp
class Base {
public:
int a;
protected:
int b;
private:
int c;
};
// 公有继承
class PublicDerived : public Base {
void foo() {
a = 1; // OK: public
b = 2; // OK: protected
// c = 3; // 错误: private不可访问
}
};
// 保护继承
class ProtectedDerived : protected Base {
void foo() {
a = 1; // OK: 变为protected
b = 2; // OK: protected
// c = 3; // 错误
}
};
// 私有继承
class PrivateDerived : private Base {
void foo() {
a = 1; // OK: 变为private
b = 2; // OK: 变为private
// c = 3; // 错误
}
};
注意事项
- 默认继承权限:
class默认为private,struct默认为public。 - 权限不影响内存布局,仅影响语法层面的访问控制。
- 使用
using可以调整特定成员的访问权限(需符合原始权限规则)。