FX-继承访问权限问题
在C++中,继承的访问控制决定了基类成员在派生类中的可见性和访问权限。C++支持三种继承方式:公有继承(public inheritance)、保护继承(protected inheritance)和私有继承(private inheritance)。每种继承方式对基类成员的访问权限有不同的影响。
1. 基类成员的访问权限
在讨论继承之前,先回顾一下基类成员的访问权限:
-
public:公有成员,可以在类的外部直接访问。
-
protected:保护成员,只能在类内部和派生类中访问。
-
private:私有成员,只能在类内部访问。
2. 继承方式对访问权限的影响
继承方式决定了基类成员在派生类中的访问权限。具体规则如下:
基类成员访问权限 | 公有继承(public) | 保护继承(protected) | 私有继承(private) |
---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
private | 不可访问 | 不可访问 | 不可访问 |
3. 详细说明
(1)公有继承(public inheritance)
-
基类的
public
成员在派生类中仍然是public
。 -
基类的
protected
成员在派生类中仍然是protected
。 -
基类的
private
成员在派生类中不可访问。
class Base {
public:
int publicVar;
protected:
int protectedVar;
private:
int privateVar;
};
class Derived : public Base {
public:
void accessBase() {
publicVar = 10; // 可以访问
protectedVar = 20; // 可以访问
// privateVar = 30; // 错误:不可访问
}
};
int main() {
Derived d;
d.publicVar = 100; // 可以访问
// d.protectedVar = 200; // 错误:不可访问
// d.privateVar = 300; // 错误:不可访问
return 0;
}
(2)保护继承(protected inheritance)
-
基类的
public
和protected
成员在派生类中都变为protected
。 -
基类的
private
成员在派生类中不可访问。
class Base {
public:
int publicVar;
protected:
int protectedVar;
private:
int privateVar;
};
class Derived : protected Base {
public:
void accessBase() {
publicVar = 10; // 可以访问,变为 protected
protectedVar = 20; // 可以访问
// privateVar = 30; // 错误:不可访问
}
};
int main() {
Derived d;
// d.publicVar = 100; // 错误:不可访问(变为 protected)
// d.protectedVar = 200; // 错误:不可访问
// d.privateVar = 300; // 错误:不可访问
return 0;
}
(3)私有继承(private inheritance)
-
基类的
public
和protected
成员在派生类中都变为private
。 -
基类的
private
成员在派生类中不可访问。
class Base {
public:
int publicVar;
protected:
int protectedVar;
private:
int privateVar;
};
class Derived : private Base {
public:
void accessBase() {
publicVar = 10; // 可以访问,变为 private
protectedVar = 20; // 可以访问,变为 private
// privateVar = 30; // 错误:不可访问
}
};
int main() {
Derived d;
// d.publicVar = 100; // 错误:不可访问(变为 private)
// d.protectedVar = 200; // 错误:不可访问(变为 private)
// d.privateVar = 300; // 错误:不可访问
return 0;
}
4. 总结
继承方式 | 基类 public 成员 | 基类 protected 成员 | 基类 private 成员 |
---|---|---|---|
公有继承 | public | protected | 不可访问 |
保护继承 | protected | protected | 不可访问 |
私有继承 | private | private | 不可访问 |
-
公有继承是最常用的继承方式,表示派生类“是一个”基类(is-a 关系)。
-
保护继承和私有继承较少使用,通常用于实现细节的封装。
-
无论哪种继承方式,基类的
private
成员在派生类中都不可访问。
5. 实际应用建议
-
优先使用公有继承,因为它符合面向对象设计的原则。
-
如果需要隐藏基类的接口,可以考虑使用**组合(Composition)**而不是私有继承。
-
保护继承和私有继承通常用于实现特定的设计模式或接口适配。
通过合理选择继承方式,可以更好地控制类的封装性和接口暴露程度。