C++权限对继承的影响

C++权限对继承的影响

在C++中,继承权限(public、protected、private)决定了基类成员在派生类中的访问级别。继承权限与基类成员的原始访问修饰符共同作用,形成最终的访问规则。

基类成员的原始访问权限
  • public:成员在类内外均可访问。
  • protected:成员仅在类内和派生类中可访问。
  • private:成员仅在类内可访问,派生类不可见。
继承权限的作用

继承权限会限制派生类对基类成员的访问上限:

  • 公有继承(public) :基类的public和protected成员在派生类中保持原权限。

    cpp 复制代码
    class Base {
    public:
        int x;
    protected:
        int y;
    private:
        int z;
    };
    class Derived : public Base {
        // x: public, y: protected, z: 不可访问
    };
  • 保护继承(protected) :基类的public和protected成员在派生类中均变为protected。

    cpp 复制代码
    class Derived : protected Base {
        // x: protected, y: protected, z: 不可访问
    };
  • 私有继承(private) :基类的public和protected成员在派生类中均变为private。

    cpp 复制代码
    class Derived : private Base {
        // x: private, y: private, z: 不可访问
    };
权限访问规则总结
  1. 派生类内部:访问权限由继承权限和基类成员的原始权限共同决定。

    • 基类的private成员始终不可访问。
    • 继承权限会降低基类public/protected成员的最高访问级别。
  2. 派生类外部 :只能通过派生类的对象访问基类的public成员(仅限公有继承)。

    cpp 复制代码
    Derived d;
    d.x; // 仅当继承为public且x在基类为public时合法
  3. 多级继承:权限会逐层叠加限制。例如:

    • 若A私有继承B,C公有继承A,则B的成员在C中均为private。
示例代码
cpp 复制代码
class Base {
public:
    int a;
protected:
    int b;
private:
    int c;
};

// 公有继承
class PublicDerived : public Base {
    void foo() {
        a = 1; // OK: public
        b = 2; // OK: protected
        // c = 3; // 错误: private不可访问
    }
};

// 保护继承
class ProtectedDerived : protected Base {
    void foo() {
        a = 1; // OK: 变为protected
        b = 2; // OK: protected
        // c = 3; // 错误
    }
};

// 私有继承
class PrivateDerived : private Base {
    void foo() {
        a = 1; // OK: 变为private
        b = 2; // OK: 变为private
        // c = 3; // 错误
    }
};
注意事项
  • 默认继承权限:class默认为private,struct默认为public。
  • 权限不影响内存布局,仅影响语法层面的访问控制。
  • 使用using可以调整特定成员的访问权限(需符合原始权限规则)。
相关推荐
zwc321043205530 分钟前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
OxYGC35 分钟前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说38 分钟前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
李纲明1 小时前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
第九序言T9 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Sakura_j_h_10 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川11 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人11 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10011 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品