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)**而不是私有继承。

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

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

相关推荐
majingming1232 小时前
FUNCTION
java·前端·javascript
zopple2 小时前
常见的 Spring 项目目录结构
java·后端·spring
是娇娇公主~3 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene3 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
Fly Wine3 小时前
Leetcode之有效字母异位词
算法·leetcode·职场和发展
xuxie994 小时前
N11 ARM-irq
java·开发语言
cjy0001114 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
程序员夏末4 小时前
【LeetCode | 第七篇】算法笔记
笔记·算法·leetcode
wefly20175 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01225 小时前
Spring Boot实现定时任务
java