改 Qt 源码踩坑实录:override 报错背后,是 Qt 与 C++ 版本的 “相爱相杀”

——————————
改 Qt 源码踩坑实录:override 报错背后,是 Qt 与 C++ 版本的 “相爱相杀”
1 问题的提出
在修改Qt源码时,提示报错:
ounter(lineounter(lineounter(line/home/ub-1001/work/myd-as62x/oe-layersetup/build/arago-tmp-default-glibc/work/aarch64-oe-linux/qtbase/5.15.7+gitAUTOINC+358aebba72-r0.arago17/git/src/plugins/platforms/linuxfb/qlinuxfbintegration.h:78:30: error: 'QList<QPlatformScreen*> QLinuxFbIntegration::screens() const' marked 'override', but does not override| 78 | QList<QPlatformScreen *> screens() const override;| | ^~~~~~~
编译的qt版本是qt5.15,它对 C++ 标准的支持采用 “基础兼容 + 可选扩展” 的策略,其核心实现基于 C++11,同时对更高版本的 C++ 标准(C++14、C++17)提供部分支持
而override 关键字用于确保派生类正确地重写基类的虚函数。它是 C++11引入的一个继承控制关键字,主要用于防止重写错误,当派生类在声明虚函数时使用 override 描述符时,该函数必须重载其基类中的同名函数,否则代码将无法通过编译。上面的错误在于说明,子类QLinuxFbIntegration::screens()想重写screens方法,但父类没有对应的方法,override编译时提示错误,可参见示例
时移世易、世易时移,虽然掌握老版本,对于新版本可以容易上手,但不了解新版本的新特性,对于可靠开发,还是很远。所有必要整理下Qt与C++的版本更新,找到差距,跟上变化。
2 Qt版本演进
Qt 作为跨平台应用开发框架,其版本迭代中出现了多个具有里程碑意义的版本,这些版本不仅推动了框架本身的进化,也深刻影响了跨平台开发的生态。以下是几个最具代表性的重要版本:
1. Qt 4.0(2005 年)
-
核心意义:奠定现代 Qt 框架的基础架构,是 Qt 从早期实验性工具向成熟商业框架转型的标志。 -
关键特性: -
首次将框架拆分为模块化结构(如 QtCore、QtGui、QtNetwork等),降低了模块间耦合,提升了灵活性。 -
改进信号槽(Signal & Slot)机制,引入元对象系统(Meta-Object System)的成熟实现,成为 Qt 最核心的特色之一。 -
扩展跨平台支持,全面覆盖 Windows、Linux、macOS 等桌面平台,同时开始探索移动设备(如 Symbian)。 -
引入 Qt Designer 可视化界面设计工具,大幅降低 GUI 开发门槛。
2. Qt 4.8(2011 年)
-
核心意义:Qt 4 系列的最后一个长期支持(LTS)版本,稳定性和兼容性极佳,至今仍被大量 legacy 项目依赖。 -
关键特性: -
优化了对嵌入式系统和移动平台(如 Maemo、MeeGo)的支持,成为当时嵌入式开发的主流框架之一。 -
完善了图形渲染性能,修复了大量 Qt 4 早期版本的漏洞,稳定性达到顶峰。 -
虽然基于 C++98/03 标准,但通过内部封装提供了部分 “准现代” 特性(如简化的容器类操作)。 -
现状:由于历史项目的惯性,部分工业软件、嵌入式设备仍在使用 Qt 4.8,但其官方支持已终止(2020 年结束)。
3. Qt 5.0(2012 年)
-
核心意义:Qt 历史上最具颠覆性的更新之一,彻底重构了框架底层,扩展了应用场景(从桌面到移动、嵌入式、甚至 Web)。 -
关键特性: -
引入 QML 和 Qt Quick:一种声明式语言 + 运行时引擎,专门用于快速开发动态界面(尤其适合移动应用和触控设备),与传统 C++ 开发模式形成互补。 -
模块化架构升级:将核心模块进一步拆分(如 QtWidgets独立于QtGui),新增QtWebKit(网页集成)、QtMultimedia(多媒体)等模块。 -
全面支持 C++11:允许开发者使用 auto、lambda、智能指针等现代 C++ 特性,提升代码效率。 -
图形后端升级:采用 OpenGL ES 作为默认渲染引擎,优化跨平台图形一致性,为移动设备适配奠定基础。
4. Qt 5.15(2020 年)
-
核心意义:Qt 5 系列的最后一个 LTS 版本,也是 Qt 从 “诺基亚时代” 转向 “The Qt Company 时代” 后的集大成者。 -
关键特性: -
整合了 Qt 5 系列的所有迭代优化(如 Qt 5.12 引入的 Qt 3D、Qt 5.14 改进的 QML 性能)。 -
强化了对现代平台的支持:全面适配 Windows 10、macOS Catalina、iOS 13、Android 10 等。 -
提供对 C++17 的部分支持(需手动开启编译选项),为后续升级到 Qt 6 铺路。 -
官方提供长期支持(至 2025 年),成为许多企业级项目的 “稳定之选”。
5. Qt 6.0(2020 年)
-
核心意义:Qt 进入 “现代架构” 的标志,聚焦性能、模块化和对未来技术的适配。 -
关键特性: -
以 C++17 为基础标准,全面利用现代 C++ 特性(如 constexpr、结构化绑定)优化框架底层。 -
重构图形架构:引入 Qt Rendering Hardware Interface (RHI),统一 OpenGL、Vulkan、Direct3D 等图形 API 的抽象层,提升跨平台渲染效率。 -
强化 Qt Quick 3D:原生支持 3D 渲染,无需依赖第三方库,简化 3D 界面开发。 -
模块化进一步精简:移除过时模块(如 Qt WebKit 替换为 Qt WebEngine),核心模块更轻量。 -
后续演进:Qt 6 系列持续迭代(如 6.2 引入 Qt Design Studio,6.5 强化对嵌入式 Linux 的支持),成为当前 Qt 开发的主流选择。
3 C++版本演进
C++ 自诞生以来经历了多次标准化迭代,每一个版本都在解决历史问题、提升开发效率、适应新的编程需求。以下是主要版本的时间、特点及作用:
1. C++98(1998 年)
-
时间:1998 年由 ISO/IEC 发布,是 C++ 的第一个国际标准(ISO/IEC 14882:1998)。 -
特点: -
确立了 C++ 的核心语法框架,包括类(class)、继承、多态、模板(泛型编程基础)、异常处理、命名空间(namespace)等。 -
基于 C 语言扩展,兼容大部分 C 语法,同时引入面向对象编程(OOP)特性。 -
作用:首次统一了 C++ 的语法标准,结束了早期编译器实现不一致的问题,为 C++ 的普及奠定了基础。
2. C++03(2003 年)
-
时间:2003 年发布(ISO/IEC 14882:2003),是对 C++98 的修订版。 -
特点: -
没有新增核心特性,主要是修复 C++98 中的漏洞(如标准库细节、语法歧义等),优化标准库实现。 -
作用:提升了标准的严谨性和编译器实现的一致性,确保 C++98 的功能更可靠。
3. C++11(2011 年)
-
时间:2011 年发布(ISO/IEC 14882:2011),原名 “C++0x”(因计划 2010 年前发布),是 C++ 历史上最重大的更新之一。 -
特点: -
引入大量现代编程特性: auto(自动类型推导)、decltype(类型查询)、lambda 表达式(匿名函数)、右值引用(&&,支持移动语义和完美转发)、智能指针(unique_ptr/shared_ptr,解决内存管理问题)。 -
增强泛型编程: constexpr(编译期常量计算)、template alias(模板别名)、可变参数模板(variadic templates)。 -
其他:范围 for 循环( for (auto x : container))、nullptr(替代NULL,避免歧义)、enum class(强类型枚举)等。 -
作用:大幅提升开发效率,解决了 C++98 中内存泄漏、代码冗余、泛型编程繁琐等问题,让 C++ 更适应现代软件开发需求(如高性能、高可读性)。
4. C++14(2014 年)
-
时间:2014 年发布(ISO/IEC 14882:2014),是 C++11 的增量更新。 -
特点: -
完善 C++11 的特性:泛型 lambda(lambda 参数支持 auto)、函数返回类型自动推导(auto func() { return 1; })、constexpr函数支持更多操作(如循环、分支)。 -
新增实用功能: std::make_unique(简化智能指针创建)、二进制字面量(0b1010)、数字分隔符(1'000'000)等。 -
作用:降低 C++11 特性的使用门槛,进一步提升代码简洁性和开发效率。
5. C++17(2017 年)
-
时间:2017 年发布(ISO/IEC 14882:2017)。 -
特点: -
结构化绑定( auto [a, b] = pair;,简化复合类型的解构)。 -
编译期条件判断( if constexpr,减少运行时分支)。 -
并行算法(标准库算法支持多线程,如 std::for_each_par)。 -
折叠表达式(fold expressions,简化可变参数模板的展开)。 -
其他: std::string_view(高效字符串视图,避免复制)、inline变量等。 -
作用:强化编译期计算能力,优化对多核处理器的支持,提升大型项目的性能和可维护性。
6. C++20(2020 年)
-
时间:2020 年发布(ISO/IEC 14882:2020),又一次重大更新。 -
特点: -
概念(Concepts,约束模板参数,替代繁琐的 enable_if,提升编译错误可读性)。 -
模块(Modules,替代 #include,解决头文件重复包含、编译慢的问题)。 -
协程(Coroutines,支持异步编程,简化状态机逻辑)。 -
范围库(Ranges,提供更灵活的序列操作,如 view::filter/view::transform)。 -
其他: consteval(强制编译期执行)、三路比较运算符(<=>)等。 -
作用:解决 C++ 长期存在的痛点(如头文件依赖、模板错误难调试),原生支持现代编程范式(异步、函数式),为大型项目提供更好的模块化和可扩展性。
7. C++23(2023 年)
-
时间:2023 年发布,是对 C++20 的完善。 -
特点: -
扩展范围 for 循环(支持初始化器,如 for (auto x : get_container()) { ... })。 -
改进协程(简化返回类型,如 task<int>)。 -
新增标准库功能: std::print(原生打印函数,替代printf/cout)、std::expected(错误处理机制)。 -
完善概念和模块的细节。 -
作用:进一步降低 C++20 新特性的使用复杂度,填补标准库功能空白(如原生打印),提升语言的易用性。
—————————–
点击阅读全文,感谢分享、收藏、点赞、在看
夜雨聆风
