QT-protected

在 Qt 和 C++ 中,protected 是一个访问控制关键字,用于定义类成员(如变量、方法等)的访问权限。protected 提供了一种介于 publicprivate 之间的访问级别,主要用于继承和派生类的情况。

基本概念

  • public:公有成员,可以被任何外部代码访问。
  • protected:受保护成员,只能被当前类及其派生类访问。
  • private:私有成员,只能被当前类内部的成员函数访问。

protected 的具体含义

  1. 当前类访问protected 成员可以被当前类的成员函数和友元函数访问。
  2. 派生类访问protected 成员可以被派生类(子类)的成员函数和友元函数访问,无论继承方式是 publicprotected 还是 private
  3. 外部访问protected 成员不能被类外部的代码直接访问。

使用场景

  • 继承和封装 :当需要允许派生类访问某些成员,但又不想让外部代码直接访问这些成员时,使用 protected
  • 实现细节隐藏:将类的实现细节隐藏起来,只暴露必要的接口,同时允许派生类访问必要的内部实现。

示例代码

以下是一个简单的示例,展示 protected 的使用:

复制代码
#include <iostream>

class Base {
protected:
   int protectedData;

public:
   Base() : protectedData(10) {}

   void showProtectedData() {
       std::cout << "Protected Data: " << protectedData << std::endl;
   }
};

class Derived : public Base {
public:
   void modifyProtectedData() {
       protectedData = 20; // 派生类可以访问 protected 成员
   }

   void showModifiedData() {
       std::cout << "Modified Protected Data: " << protectedData << std::endl;
   }
};

int main() {
   Base base;
   base.showProtectedData();

   Derived derived;
   derived.modifyProtectedData();
   derived.showModifiedData();

   // base.protectedData = 30; // 错误,外部代码不能直接访问 protected 成员

   return 0;
}

输出结果

复制代码
Protected Data: 10
Modified Protected Data: 20

注意事项

  • 继承方式影响 :不同的继承方式(publicprotectedprivate)会影响 protected 成员在派生类中的访问权限。
  • public 继承:protected 成员在派生类中仍然是 protected
  • protected 继承:protected 成员在派生类中变为 protected
  • private 继承:protected 成员在派生类中变为 private
  • 访问控制 :合理使用 protected 可以提高代码的封装性和可维护性,但过度使用可能会导致代码复杂度增加。

通过 protected 访问控制,可以在继承层次中实现灵活的成员访问策略,既保护了类的内部实现,又允许派生类进行必要的访问和扩展。

相关推荐
折哥的程序人生 · 物流技术专研3 分钟前
《Java 100 天进阶之路》第23篇:缓冲区数据结构 ByteBuffer
java·开发语言·数据结构·后端·面试·求职招聘
lsx20240620 分钟前
Razor VB 循环
开发语言
csuzhucong21 分钟前
c++版本特性
开发语言·c++
wand codemonkey43 分钟前
【第五步+前后分离调】最后的联动调试--java+Vue3项目
java·开发语言·vue.js
RSTJ_16251 小时前
PYTHON+AI LLM DAY FOURTY-SEVEN
开发语言·人工智能·python·深度学习
代钦塔拉1 小时前
第二篇:VS2019 + Qt5.9.9 中文乱码实战:源码GB2312不乱码、文件写入与跨平台方案
开发语言·qt
.小小陈.2 小时前
Linux 多线程进阶:线程互斥、同步、线程池、死锁与线程安全、读写锁、自旋锁
linux·开发语言·c++
lingran__2 小时前
C++入门基础
开发语言·c++
吃好睡好便好2 小时前
Matlab中三种三维图的对比
开发语言·人工智能·学习·算法·matlab·信息可视化
Highcharts.js2 小时前
无需搭建数据管道,如何快速上线投资基金筛选器?
开发语言·javascript·react.js·前端框架·highcharts