【Qt】C++中protected与private的区别

在 C++ 中,protected 和 private 都是访问控制符,区别主要在于:

  • private:只有当前类自己能访问
  • protected:当前类 + 子类(派生类)可以访问

一、对比表

访问权限 当前类 子类 类外部
private ✅ ❌ ❌
protected ✅ ✅ ❌

二、private 示例

cpp 复制代码
class Base
{
private:
    int m_value;

public:
    void setValue(int v)
    {
        m_value = v; // 当前类内部可以访问
    }
};

class Child : public Base
{
public:
    void test()
    {
        // m_value = 10; // ❌ 编译错误
    }
};

这里:

  • Base 自己能访问 m_value
  • Child(子类)不能访问
  • 外部更不能访问

三、protected 示例

cpp 复制代码
class Base
{
protected:
    int m_value;
};

class Child : public Base
{
public:
    void test()
    {
        m_value = 10; // ✅ 子类可以访问
    }
};

这里:

  • Base 可以访问
  • Child 可以访问
  • 外部仍然不能访问

四、外部访问区别

无论 private 还是 protected:

cpp 复制代码
Base obj;
obj.m_value = 10; // ❌ 都不允许

类外部都不能直接访问。


五、为什么需要 protected?

主要用于:

"给子类使用,但不给外部使用"

比如 Qt/MFC/framework 框架中经常这样:

cpp 复制代码
class Widget
{
protected:
    virtual void paintEvent();
};

子类可以重写:

cpp 复制代码
class MyWidget : public Widget
{
protected:
    void paintEvent() override;
};

但外部用户不能随便调用:

cpp 复制代码
MyWidget w;
w.paintEvent(); // ❌ 不允许

这样可以保证:

  • 框架内部机制可扩展
  • 外部接口保持安全

六、设计建议(很重要)

实际开发里:

优先使用 private

因为:

  • 封装性更强
  • 子类不会依赖内部实现
  • 后期更容易修改

很多大型项目甚至遵循:

"能 private 就不要 protected"


protected 的风险

子类会"耦合"父类内部实现。

例如:

cpp 复制代码
protected:
    int buffer[1024];

以后你想改成:

cpp 复制代码
std::vector<int> buffer;

可能所有子类都得改。


七、Qt 中常见用法

Qt 大量使用 protected:

cpp 复制代码
protected:
    void mousePressEvent(QMouseEvent *event) override;

因为 Qt 希望:

  • 子类能重写事件
  • 外部不能乱调用事件函数

这是 protected 的典型场景。


八、一个经典记忆方式

可以这样记:

text 复制代码
private
= 自己的秘密
= 连儿子(子类)都不给看

protected
= 家族内部可见
= 儿子可以用

九、补充:继承时还会影响访问级别

例如:

cpp 复制代码
class Child : protected Base

这里的 protected 是"继承方式",和成员权限不是一回事。

这是另一个概念:

  • public 继承
  • protected 继承
  • private 继承
相关推荐
见叶之秋16 分钟前
C++ 泛型世界的两块拼图:容器适配器与仿函数
java·开发语言
逗脑IDE36 分钟前
零基础学ESP32:RFID无线射频卡——让ESP32拥有“刷卡“能力!
开发语言·网络·人工智能·python·esp32·硬件开发
小师兄吃牛肉40 分钟前
C语言篇:内联函数
c语言·开发语言
yuniko-n1 小时前
【Java】字符串相关坑点
java·开发语言·python
jimy11 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
ss2731 小时前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
菜鸟~noob2332 小时前
【电子战】第20篇:凸优化与对数障碍法【含matlab代码】
开发语言·matlab
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
小小龙学IT2 小时前
Python SQLAlchemy 2.0 深度解析:从 Core 到 ORM 的数据访问双引擎
开发语言·数据库·python
2601_962885722 小时前
如何用 Python 计算 ROC 变动率指标做动量分析?
开发语言·python·算法