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

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

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

相关推荐
校长20083 分钟前
mac安装java环境
java
dengjiayue8 分钟前
golang 高性能的 MySQL 数据导出
开发语言·mysql·golang
折枝寄北13 分钟前
从零开始 | C语言基础刷题DAY1
c语言·开发语言·算法
简 洁 冬冬34 分钟前
java中过滤器
java
.ccl41 分钟前
蓝桥杯省赛真题C++B组2024-握手问题
c++·算法·蓝桥杯
V+zmm101341 小时前
电器维修系统小程序+论文源码调试讲解
java·数据库·微信小程序·小程序·毕业设计
PawSQL1 小时前
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
java·数据库·人工智能·sql·sql优化·pawsql·deepseek
arong_xu1 小时前
C++20 新特性总结
算法·c++20
hrrrrb1 小时前
【C语言】指针篇
c语言·数据结构·算法
BeanInJ1 小时前
JAVA字符串与正则表达式
java·正则表达式