当前位置: 首页 > article >正文

FX-继承访问权限问题

在C++中,继承的访问控制决定了基类成员在派生类中的可见性和访问权限。C++支持三种继承方式:公有继承(public inheritance)保护继承(protected inheritance)私有继承(private inheritance)。每种继承方式对基类成员的访问权限有不同的影响。


1. 基类成员的访问权限

在讨论继承之前,先回顾一下基类成员的访问权限:

  • public:公有成员,可以在类的外部直接访问。

  • protected:保护成员,只能在类内部和派生类中访问。

  • private:私有成员,只能在类内部访问。


2. 继承方式对访问权限的影响

继承方式决定了基类成员在派生类中的访问权限。具体规则如下:

基类成员访问权限公有继承(public)保护继承(protected)私有继承(private)
publicpublicprotectedprivate
protectedprotectedprotectedprivate
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 成员
公有继承publicprotected不可访问
保护继承protectedprotected不可访问
私有继承privateprivate不可访问
  • 公有继承是最常用的继承方式,表示派生类“是一个”基类(is-a 关系)。

  • 保护继承私有继承较少使用,通常用于实现细节的封装。

  • 无论哪种继承方式,基类的 private 成员在派生类中都不可访问。


5. 实际应用建议

  • 优先使用公有继承,因为它符合面向对象设计的原则。

  • 如果需要隐藏基类的接口,可以考虑使用**组合(Composition)**而不是私有继承。

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

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


http://www.kler.cn/a/580091.html

相关文章:

  • 小程序 wxml 语法 —— 35 wxml 语法 -声明和绑定数据
  • nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测
  • chebykan与代码3
  • 重估首程控股:一只产业生态完整的“机器人ETF”
  • 基于DeepSeek的智慧医药系统(源码+部署教程)
  • 【redis】pipeline管道
  • Java的缓存
  • 学习笔记12——并发编程之线程之间协作方式
  • 『VUE』QL面试真题2025.02(详细图文注释)
  • Vue笔记
  • C++11新特性 13.共享智能指针shared_ptr
  • 基于全局拓扑图和双尺度图Transformer的视觉语言导航
  • 基于SSM+Vue的汽车维修保养预约系统+LW示例
  • RuleOS:区块链开发的“破局者”,开启Web3新纪元
  • 狮子座大数据分析(python爬虫版)
  • 【AI论文】SurveyX: 通过大型语言模型实现学术调查自动化
  • FPGA前端设计适合哪些人学?该怎么学?
  • 【kubernetes】service
  • VS 2022 安装速成指南
  • SVN 标签