news 2026/6/23 11:40:02

C++11final与override6、智能指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++11final与override6、智能指针

1.final 与 override 关键字

这两个关键字专门用于类继承 + 虚函数重写,作用是:编译期强制校验语法,杜绝隐藏 bug,是 C++ 多态的安全规范。

1. override:强制检查「虚函数重写」


核心作用
1.只能修饰子类的虚函数;
2.告诉编译器:这个函数必须是重写基类的虚函数;
3.如果函数名 / 参数 / 返回值写错,直接编译报错(传统写法不会报错,会变成新函数,导致多态失效)。
语法:

// 子类虚函数末尾加 override void 函数名(参数) override;

代码示例:

#include <iostream> using namespace std; // 基类 class Base { public: virtual void show() { cout << "Base\n"; } }; // 子类 class Derive : public Base { public: // ✅ 正确:重写基类虚函数,override 校验通过 void show() override { cout << "Derive\n"; } // ❌ 错误:函数名写错(shou),编译器直接报错! // void shou() override { cout << "Derive\n"; } };

必须用 override:它是虚函数重写的「保险栓」,彻底避免因手误导致的多态失效。

2. final:禁止重写 / 禁止继承

有两种用法,语义完全不同:

用法 1:修饰虚函数 → 禁止子类重写:
class Base { public: // 该虚函数无法被任何子类重写 virtual void func() final { cout << "final func\n"; } }; class Derive : public Base { public: // ❌ 报错:无法重写 final 函数 // void func() override {} };
用法 2:修饰类 → 禁止该类被继承:
// 最终类,不能有子类 class FinalClass final { }; // ❌ 报错:无法继承 final 类 // class Son : public FinalClass { };

2.智能指针 (Smart Pointers)

C++ 用 new 动态分配的内存,必须手动 delete,否则会内存泄漏。
智能指针:封装裸指针的类,离开作用域时自动调用 delete 释放内存,无需手动管理,从根源避免泄漏。

1.std::unique_ptr:独占式智能指针(最常用)
特性:
  • 同一时间只有一个指针拥有对象所有权;
  • 禁止拷贝,只能移动(转移所有权);
  • 性能和裸指针完全一致,无额外开销;
  • 默认优先使用它!

用法示例:

#include <iostream> #include <memory> using namespace std; int main() { // 1. 创建 unique_ptr,管理 int 对象 unique_ptr<int> p1(new int(10)); cout << *p1 << endl; // 10 // 2. 移动语义:转移所有权(p1 变为空) unique_ptr<int> p2 = move(p1); cout << *p2 << endl; // 10 // 3. 离开作用域,自动释放内存,无需 delete return 0; }
2. std::shared_ptr:共享式智能指针

特性:
多个指针共享同一个对象;
内部维护引用计数:
拷贝 → 计数 + 1
析构 → 计数 - 1
计数 = 0 → 自动释放内存
有轻微性能开销(维护计数)

用法示例:

int main() { // 创建 shared_ptr shared_ptr<int> p1(new int(20)); cout << "计数:" << p1.use_count() << endl; // 1 // 拷贝,共享所有权 shared_ptr<int> p2 = p1; cout << "计数:" << p1.use_count() << endl; // 2 // 所有指针失效后,内存自动释放 return 0; }
3. std::weak_ptr:弱引用指针(解决循环引用)

核心问题:
shared_ptr 会出现循环引用:两个对象互相持有对方的 shared_ptr,计数永远不为 0,内存泄漏。
特性:
不拥有对象所有权,不增加引用计数;
仅作为「观察者」,监测对象是否存活;
必须配合 shared_ptr 使用。
核心方法:
expired():判断对象是否已释放
lock():转为 shared_ptr 访问对象

总结:

1.优先用 std::make_unique/std::make_shared 创建智能指针(更安全、高效)

auto p = make_unique<int>(10); auto sp = make_shared<double>(3.14);

2.不要混用裸指针和智能指针;
3.不要手动 delete 智能指针管理的内存;
4.能用 unique_ptr 绝不用 shared_ptr(性能最优)。

谢谢
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 5:31:54

终极webOS TV设备管理神器:轻松掌控智能电视的完整指南

终极webOS TV设备管理神器&#xff1a;轻松掌控智能电视的完整指南 【免费下载链接】dev-manager-desktop Device/DevMode Manager for webOS TV 项目地址: https://gitcode.com/gh_mirrors/de/dev-manager-desktop 想要摆脱复杂的命令行操作&#xff0c;轻松管理你的we…

作者头像 李华
网站建设 2026/6/14 5:31:53

Notepad++ 突发三处高危安全漏洞:XML 配置文件遭篡改可执行任意代码,开发者紧急发布 v8.9.6.1 热修复版本

五月底&#xff0c;安全社区爆出一则足以让 Windows 用户警觉的消息。多位独立安全研究人员联合披露了流行文本编辑器 Notepad 的三处独立安全缺陷&#xff0c;其中两处达到高危级别&#xff0c;攻击者只需改动几个 XML 标签就能在受害者机器上悄悄执行任意程序。更棘手的是&am…

作者头像 李华
网站建设 2026/6/18 9:12:51

《OpenClaw×NVIDIA模型目录实战指南》

本地算力释放的核心价值从来不是成本控制&#xff0c;而是对AI Agent运行时序的绝对掌控与数据主权的完整保留。云端API的标准化服务看似便捷&#xff0c;却天然存在网络波动的不可控性与数据传输的安全边界&#xff0c;哪怕是毫秒级的中断&#xff0c;都会让复杂任务链的逻辑连…

作者头像 李华
网站建设 2026/6/14 5:31:52

工业级RS485模拟量采集模块设计:从MODBUS协议到高精度ADC实战

1. 项目概述与设计初衷最近帮几个临近毕业的兄弟赶了个小玩意儿&#xff0c;他们导师催得紧&#xff0c;要做一个能接入工业现场、采集模拟量信号并通过标准总线传输的模块。说白了&#xff0c;就是一个基于MODBUS RTU协议的RS485模拟传感器变送器。这几位爷自己懒得动手画板调…

作者头像 李华
网站建设 2026/6/14 5:32:12

微信与手机厂商A2A合作破局,微信AI携小程序迎战阿里、字节

微信A2A助手能力&#xff1a;开启合作新篇章 昨日&#xff0c;腾讯客服透露&#xff0c;微信正与华为、小米、荣耀、OPPO、vivo等手机厂商合作推出A2A助手能力&#xff0c;多家厂商已完成接入。用户可通过对应手机系统的AI助手发起微信音视频通话或向指定好友发送消息。该功能基…

作者头像 李华