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 成员在派生类中不可访问。

cpp 复制代码
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)
  • 基类的 publicprotected 成员在派生类中都变为 protected

  • 基类的 private 成员在派生类中不可访问。

cpp 复制代码
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)
  • 基类的 publicprotected 成员在派生类中都变为 private

  • 基类的 private 成员在派生类中不可访问。

cpp 复制代码
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)**而不是私有继承。

  • 保护继承和私有继承通常用于实现特定的设计模式或接口适配。

通过合理选择继承方式,可以更好地控制类的封装性和接口暴露程度。

相关推荐
水上冰石3 分钟前
comfui的sd1.5模型,有多少采样算法,详解每一个采样算法
人工智能·算法
l1t7 分钟前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程18-20
开发语言·python
磊 子14 分钟前
STL之deque和list以及两者与vector的对比
开发语言·c++·list
凤山老林15 分钟前
DDD(领域驱动设计)在复杂业务系统中的落地指南
java·开发语言·数据库·ddd·领域驱动
JEECG低代码平台20 分钟前
JimuChatBI — 首款免费开源的 Java 智能问数ChatBI平台,零成本接入,AI对话式智能分析
java·人工智能·开源·aigc·人工智能低代码
黎阳之光20 分钟前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全
凯瑟琳.奥古斯特26 分钟前
子查询原理与实战案例解析
开发语言·数据库·职场和发展·数据库开发
Eiceblue27 分钟前
Python 操作 Excel:数据分组、分类汇总与取消分组全解
开发语言·python·excel
山上三树29 分钟前
C/C++ 高频报错速查表(开发通用版)
c语言·开发语言·c++
cheems952732 分钟前
[算法手记] 贪心 爬楼梯问题
算法·贪心算法