protected,private,public三者的区别

 一、访问权限(最核心区别)

访问限定符类内(成员函数)可访问派生类可访问类外(对象)可访问
public
protected
private

private 最封闭,protected 只对子类开放,public 对所有人开放。


二、示例:类内、子类、外部访问

#include <iostream>

class Base {
public:
    int pub = 1;          // 公开成员
protected:
    int prot = 2;         // 受保护成员
private:
    int priv = 3;         // 私有成员
};

class Derived : public Base {
public:
    void show() {
        std::cout << pub << "\n";   // ✅ 可访问
        std::cout << prot << "\n";  // ✅ 可访问(protected对子类可见)
        // std::cout << priv << "\n";  // ❌ 不可访问(private对子类隐藏)
    }
};

int main() {
    Base b;
    Derived d;

    std::cout << b.pub << "\n";     // ✅ public 对外可访问
    // std::cout << b.prot << "\n";  // ❌ protected 不可外部访问
    // std::cout << b.priv << "\n";  // ❌ private 不可外部访问
}

三、继承时的访问级别变化

继承时,父类成员会因为继承方式不同而改变可见性。
(⚠️ 这点容易混)

继承方式父类的 public 成员在子类中变成父类的 protected 成员在子类中变成父类的 private 成员
public 继承publicprotected不可访问
protected 继承protectedprotected不可访问
private 继承privateprivate不可访问

🔹 举例:

class Base {
public:
    int a;
protected:
    int b;
private:
    int c;
};

class Derived1 : public Base {};
class Derived2 : protected Base {};
class Derived3 : private Base {};
成员Derived1中访问级别Derived2中访问级别Derived3中访问级别
a(public)✅ public✅ protected✅ private
b(protected)✅ protected✅ protected✅ private
c(private)❌ 不可访问❌ 不可访问❌ 不可访问

 四、实际应用场景举例

关键字典型用法场景说明
public对外提供接口类的外部接口函数(如 getter/setter、API)
protected给子类继承用父类希望子类能访问但外部不能(模板方法、基类辅助函数)
private封装内部实现数据成员、工具函数,不希望外界访问

示例:封装与继承

class Animal {
public:
    void eat() { std::cout << "eat\n"; } // 公共接口
protected:
    void breathe() { std::cout << "breathe\n"; } // 子类能用
private:
    void think() { std::cout << "think\n"; } // 仅自己能用
};

class Dog : public Animal {
public:
    void run() {
        eat();      // ✅ 继承自public
        breathe();  // ✅ 继承自protected
        // think(); // ❌ 无法访问
    }
};

五、总结口诀

限定符谁能访问常用位置用途
public所有人类接口提供功能
protected自己 + 子类基类方法继承扩展
private仅自己数据成员封装隐藏

口诀:

public 人人能看,
protected 儿孙能看,
private 自家能看。


protected 用来干嘛?

用来让基类保留“对子类开放”的接口,而仍然对外部隐藏。
比如虚函数模板方法模式(Template Method)。

在模板方法模式中,父类定义流程,子类填细节。
控制继承范围:让子类访问内部工具函数。

防止外部直接创建或销毁资源

类之间的协作,如框架开发。

class Widget {
public:
    void draw();         // 对外接口
protected:
    virtual void paint(); // 由子类重写的绘制逻辑
};

public / protected / private 继承的区别?

影响的是基类成员在派生类中的访问级别,而不是继承数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值