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

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

  • 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 继承
相关推荐
撑伞的鱼993717 小时前
C++开发用什么AI编程工具效果好?2026年实测横评(附选型指南)
开发语言·c++·ai编程·cursor
大数据张老师17 小时前
Typora 导出 Word 模版操作手册
开发语言·c#·word·typora
略略略咯咯17 小时前
stream流浅拷贝
开发语言·python
long31617 小时前
Java 团队入门到精通学习资料
java·开发语言
城管不管17 小时前
rabbitmq如何保证消息不丢失?解决方案又是什么?
开发语言·ai·面试·职场和发展·rabbitmq·php·agent
程序员良辰17 小时前
【TongWeb7】启动接近两分钟问题排查
java·开发语言·中间件
深色風信子17 小时前
Kotlin Bytedeco OpenCV 图像图像58 无缝克隆
开发语言·opencv·kotlin·bytedeco
朝阳3917 小时前
react19【系列实用教程】实用组件封装
开发语言·前端·javascript
我是苏苏17 小时前
C#基础:使用System.Speech.Synthesis离线播放/朗读文字内容
开发语言·c#
j7~18 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步