C++中protected,private,public三者的区别详解

 更新时间:2025年10月28日 10:43:39   作者:狂奔的sherry  
这篇文章主要介绍了C++中protected,private,public三者区别的相关资料,C++ 中 public、private 和 protected 访问修饰符的主要区别在于它们对类成员的访问权限控制,文中通过代码介绍的非常详细,需要的朋友可以参考下

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

访问限定符类内(成员函数)可访问派生类可访问类外(对象)可访问
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 继承的区别?

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

总结

到此这篇关于C++中protected,private,public三者区别的文章就介绍到这了,更多相关protected,private,public区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt自定义控件实现圆盘进度条

    Qt自定义控件实现圆盘进度条

    这篇文章主要为大家详细介绍了Qt自定义控件实现圆盘进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C++中的关键字volatile详解

    C++中的关键字volatile详解

    这篇文章主要介绍了C++中的关键字volatile使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C++引用和结构体介绍

    C++引用和结构体介绍

    这篇文章主要介绍了C++引用和结构体,结构体是我们自定义的复合类型,本质上也是一种变量类型,所以一样可以使用引用,下面来看看文章内容详细介绍,需要的朋友可以参考一下
    2021-11-11
  • C++逆向分析移除链表元素实现方法详解

    C++逆向分析移除链表元素实现方法详解

    这篇文章主要介绍了C++实现LeetCode(203.移除链表元素),本篇文章通过逆向分析的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2022-11-11
  • C语言中双链表的基本操作

    C语言中双链表的基本操作

    这篇文章主要介绍了C语言中双链表的基本操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++中stack容器的使用

    C++中stack容器的使用

    本文主要介绍了C++中stack容器的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • C语言获取文件大小的两种方式

    C语言获取文件大小的两种方式

    因为音视频开发的需要,经常会写一些文件输入输出的测试程序,常常用到获取文件大小的函数,本篇文章就记录一下常用的两种获取文件大小的方式,希望对大家有所帮助
    2023-11-11
  • c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    这篇文章主要介绍了c++如何控制对象的创建方式和创建的数量,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • C语言不用链表完成学生管理系统(完整代码)

    C语言不用链表完成学生管理系统(完整代码)

    这篇文章主要介绍了C语言不用链表完成学生管理系统(完整代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • VC++中HTControl的CHTButton按钮控件类用法实例解析

    VC++中HTControl的CHTButton按钮控件类用法实例解析

    这篇文章主要介绍了VC++中HTControl的CHTButton按钮控件类用法,对于大家进行VC++项目开发有一定的帮助作用,需要的朋友可以参考下
    2014-08-08

最新评论