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

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

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

相关推荐
寻星探路2 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
lly2024064 小时前
Bootstrap 警告框
开发语言
2601_949146534 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
你撅嘴真丑5 小时前
第九章-数字三角形
算法
曹牧5 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX5 小时前
服务异步通信
开发语言·后端·微服务·ruby
uesowys5 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
zmzb01035 小时前
C++课后习题训练记录Day98
开发语言·c++
ValhallaCoder5 小时前
hot100-二叉树I
数据结构·python·算法·二叉树