Q: 多态是怎么实现的?
A: 通过基类指针或引用指向派生类对象。每个对象有 vptr 指向自己的 vtable,
   vtable 中存储虚函数地址。调用虚函数时,从对象的 vptr 找到 vtable,
   再找到对应的函数地址执行。这个过程叫动态绑定。

Q: 为什么用指针/引用,不能直接用对象?
A: 直接赋值会触发"对象切片",派生类特有的成员被切割掉,vptr 也被覆盖,
   无法实现多态。指针和引用只保存地址,不拷贝对象,所以能保留完整信息。

场景 推荐 原因
函数参数(只读) const T& 不拷贝,不能为空
函数参数(修改) T& 简洁,安全
返回值(存在) const T& 或 T& 避免拷贝
返回值(可能不存在) T* 可以返回 NULL
动态内存分配 T* new 返回指针
动态数组 T* 或 T** 必须用指针
可选参数 T* 可以传 NULL
多态 T* 或 T& 都可以
遍历容器 const T& 避免拷贝
链式调用 T& 返回 *this
成员变量(对象) T 或 T* 看生命周期
成员变量(数组) T* 或 T** 必须用指针

环境配置的目的:

环境配置的核心目的,就是为你的代码在特定计算机上成功编译、链接和运行,建立一套完整、正确的“工具链”和“依赖库”环境

简单说,就是让编译器能听懂你的代码,链接器能找到它依赖的库,最终生成一个能跑起来的程序。

🧩 环境配置解决了哪些问题?

问题 说明 如果配置不对会怎样
编译器找不到头文件 #include <QMainWindow> 需要编译器知道去哪找 Qt 的头文件 报错:QMainWindow: No such file or directory
链接器找不到库文件 你的代码用到了 Qt 的库函数,链接器需要找到对应的 .lib 或 .a 文件 报错:LNK2019: 无法解析的外部符号
运行时找不到 DLL 程序启动时需要加载 Qt 的 Qt6Core.dll 等动态链接库 报错:由于找不到 Qt6Core.dll,无法继续执行代码
编译器版本不匹配 Qt 和编译器(MinGW/MSVC)版本必须配套 报错:incompatible compiler 或各种奇怪的链接错误
构建系统(qmake/CMake)找不到 Qt qmake 需要知道 Qt 的安装路径才能生成正确的 Makefile 报错:Cannot find file: ... .pro

🔧 环境配置包含哪些内容?

1. 编译器工具链

  • MinGW 或 MSVC:C++ 编译器本身

  • make / nmake / jom:构建工具,负责调用编译器

  • gdb / cdb:调试器,用于调试程序

2. Qt 框架本身

  • 头文件(include):所有 Qt 类的声明(如 QMainWindow

  • 库文件(lib):已编译好的 Qt 函数实现

  • 动态链接库(bin/dll):运行时需要的 .dll 文件

  • qmake:Qt 项目构建工具,用于生成 Makefile

  • moc / uic / rcc:元对象编译器、UI 编译器和资源编译器

3. 路径与变量配置

配置项 用途
INCLUDEPATH 告诉编译器头文件的搜索路径
LIB / LIBS 告诉链接器库文件的搜索路径
PATH 告诉运行时系统 DLL 的搜索路径
.pro 文件中的 QT += widgets 告诉 qmake 需要链接哪些 Qt 模块
环境变量(如 INCLUDELIB 让编译器和链接器在系统范围内找到所需文件
CMake / qmake 配置 让构建工具正确调用编译器和链接器,传递正确的参数

🎯 环境配置的本质

环境配置的本质就是让工具链和库文件“彼此认识”

┌─────────────────────────────────────────────────────────────────┐
│  源代码 (*.cpp, *.h, *.ui)                                     │
│      │                                                         │
│      ▼                                                         │
│  ★ 环境配置告诉工具:"Qt 的头文件在 D:\Qt\...\include"        │
│      │                                                         │
│      ▼                                                         │
│  编译器(cl.exe / g++.exe)→ 编译成 .obj / .o                 │
│      │                                                         │
│      ▼                                                         │
│  ★ 环境配置告诉工具:"Qt 的库文件在 D:\Qt\...\lib"            │
│      │                                                         │
│      ▼                                                         │
│  链接器(link.exe / ld)→ 链接成 .exe 可执行文件              │
│      │                                                         │
│      ▼                                                         │
│  ★ 环境配置告诉系统:"Qt 的 DLL 在 D:\Qt\...\bin"             │
│      │                                                         │
│      ▼                                                         │
│  运行时 → 加载 DLL → 程序成功运行 ✅                           │
└─────────────────────────────────────────────────────────────────┘

💡 总结

问题 答案
环境配置是什么? 让编译器、链接器和运行时系统能找到所有必要的文件
为什么要配置? 否则工具链不知道去哪找头文件、库文件和动态链接库
核心配置哪些? 头文件路径(include)、库文件路径(lib)、DLL 路径(bin)、构建工具路径(qmake/CMake)
怎么验证配置成功了? 编译不报错、链接不报错、运行不崩溃 😊

环境配置的目的是使最终生成的可执行程序可以进行全局访问。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐