news 2026/6/9 22:08:28

你真的了解C++吗》No.030:非虚函数在继承体系中的设计原则——NVI 模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
你真的了解C++吗》No.030:非虚函数在继承体系中的设计原则——NVI 模式

《你真的了解C++吗》No.030:非虚函数在继承体系中的设计原则——NVI 模式

导言:谁才是流程的控制者?

在传统的面向对象设计中,我们习惯于直接调用虚函数。但在复杂的工业级代码中,这种做法会产生一个弊端:基类无法在虚函数执行前后进行“统一管理”(比如加锁、记录日志或合法性检查)。

为了解决这个问题,C++ 社区推崇一种设计模式:NVI (Non-Virtual Interface,非虚接口) 原则


一、 NVI 的核心:公有接口非虚,虚函数私有化

NVI 原则的核心思想非常简单:

  1. 外界接口:声明为public,但必须是非虚(non-virtual)的。
  2. 具体实现:声明为virtual,但通常建议设为private(或者protected,如果子类需要显式调用)。
classGameCharacter{public:// 外界调用的唯一接口:非虚voidheal(intamount){// [前置工作]:记录日志,检查角色是否已经死亡if(isDead())return;doHeal(amount);// 调用真正的业务逻辑// [后置工作]:更新 UI,触发数值溢出检查clampHealth();}private:// 真正的逻辑:虚函数,私有virtualvoiddoHeal(intamount)=0;};classWarrior:publicGameCharacter{private:virtualvoiddoHeal(intamount){// 战士特有的回血逻辑}};

二、 为什么这样做?(NVI 的三大优势)

1. 强制性的“切面”逻辑

通过非虚的heal(),基类确保了无论哪个子类,在执行回血逻辑之前,都必须先经过“死亡检查”。子类只需要关注“怎么回血”,而不需要关注“什么时候能回血”。

2. 接口与实现的分离

public接口代表了稳定性,而private virtual代表了灵活性。你可以随意更改虚函数的签名或逻辑,只要非虚的包装函数不变,外界调用者甚至不需要感知。

3. 解决“虚函数可见性”的悖论

很多人奇怪:基类私有的虚函数,子类能重写吗?
答案是:能!虚函数的重写(Override)取决于函数名和签名,而不是访问权限。派生类虽然不能“调用”基类的私有虚函数,但完全可以“提供”一个新的实现放入虚表(vtbl)中。


三、 特例:什么时候该用protected virtual

在 NVI 模式下,如果派生类在实现自己的虚函数时,需要显式地调用基类的实现(即Base::doSomething()),那么这个虚函数必须设为protected。否则,请坚持使用private,以实现最强的封装。


总结:架构师的权力

  • NVI 原则是对“模板方法(Template Method)”设计模式的完美实践。
  • 它让基类成为了流程的独裁者,而让子类成为了任务的执行者
  • 在设计复杂的类层次结构时,先写一个非虚的public函数作为入口,往往是更成熟的做法。

🟢 第三阶段·总结

至此,我们已经看透了 C++03 继承体系的每一层皮肉:从虚表的内存布局(No.021),到菱形继承的纠缠(No.024),再到现在的 NVI 设计准则(No.030)。


下一阶段预告:我们将告别运行时的多态,进入一个“在编译阶段就解决一切”的神奇领域。在这里,代码不是运行出来的,而是“算”出来的。

➡️《你真的了解C++吗》No.031:模板是“宏”的加强版吗?——模板推导的类型安全与物理真相。

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

强烈安利自考必看TOP9 AI论文网站

强烈安利自考必看TOP9 AI论文网站 2026年自考论文写作工具测评:为何需要一份权威榜单? 随着人工智能技术的不断进步,越来越多的自考生开始借助AI工具提升论文写作效率。然而,面对市场上琳琅满目的论文辅助平台,如何选…

作者头像 李华
网站建设 2026/5/28 15:01:41

2026必备!9个AI论文工具,助本科生轻松写论文!

2026必备!9个AI论文工具,助本科生轻松写论文! AI 工具正在改变论文写作的未来 在当前的学术环境中,越来越多的本科生开始借助 AI 工具来提升论文写作效率。无论是内容生成、结构优化,还是降低 AIGC 率,这些…

作者头像 李华
网站建设 2026/6/10 14:47:37

加解密和摘要算法

介绍\不同类型算法 对称加解密算法 非对称加解密算法 摘要算法 相关算法 AES(主流) 3DES(已逐步淘汰) SM4(国密) RSA ECC(椭圆曲线加密) SM2(国密算法) SHA-256/SHA-384 SM3(国密) MD5(已不安全) SHA-1(已不安全) 特点 加解密速度快。 适合大数据量的加解密。 …

作者头像 李华
网站建设 2026/6/9 21:27:49

城市“数字路灯”:车流动态调光把电耗再降18%

路灯是城市基础设施的重要组成部分,承担着夜间照明、保障出行安全的核心职能,但其全天候固定亮度运行模式,导致电耗居高不下,成为城市节能降耗的一大短板。传统城市路灯多采用“日落开灯、日出关灯”的粗放管控,无论路…

作者头像 李华
网站建设 2026/6/10 15:01:41

宠物常规护理知识管理系统(11828)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告)远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/6/8 22:23:31

测试员拯救纽约:AI预测地铁瘫痪的惊魂72小时

危机预警与测试员的登场 2026年初,纽约市地铁系统部署了“MetroMind”AI预测平台,旨在通过实时数据分析优化列车调度和故障预警。这个系统由清源集团开发,号称能提前72小时预测重大故障,但内部测试阶段就暴露了潜在漏洞。李明&am…

作者头像 李华