news 2026/7/16 9:14:53

ATL的使用办法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ATL的使用办法

ATL使用方法

#include<iostream>#include<atlbase.h>#include<atlwin.h>template<classT>classEdoyun{public:voidshow(){T*p=static_cast<T*>(this);p->Name();}public:voidName(){std::cout<<"Edoyun"<<std::endl;}// 不是虚函数};classSub:publicEdoyun<Sub>{public:voidName(){std::cout<<"Sub"<<std::endl;}};classSub2:publicEdoyun<Sub2>{};intmain(){Sub sub1;Sub2 sub2;sub1.Name();sub2.Name();}

这段代码是CRTP(奇异递归模板模式)的经典示例,涉及以下几个核心知识点:


1. CRTP(Curiously Recurring Template Pattern)

定义:子类继承自以自己为模板参数的基类。

classSub:publicEdoyun<Sub>{// Sub 继承 Edoyun<Sub>,把自己当模板参数

这是 C++ 模板元编程的经典设计模式,ATL/WTL、Boost 里大量使用。


2. 静态多态(编译期多态)

基类里通过static_castthis强转子类指针,在编译期就确定调用哪个函数,不需要虚函数:

voidshow(){T*p=static_cast<T*>(this);// 安全的向下转型p->Name();// 编译期决定调用子类还是基类的 Name()}

和动态多态(虚函数)对比

CRTP 静态多态虚函数动态多态
决议时机编译期运行期
性能开销无(直接调用)虚表指针、虚表查找
用法子类继承Base<Sub>基类写 virtual,子类 override
灵活性编译时确定运行时可动态切换

3. 名字隐藏(Name Hiding)

子类的Name()不是重写(没有 virtual),而是隐藏了基类的同名函数:

Sub sub1;sub1.Name();// 调用 Sub::Name(),输出 "Sub" —— 子类隐藏了基类版本Sub2 sub2;sub2.Name();// Sub2 没定义 Name(),调用继承的 Edoyun::Name(),输出 "Edoyun"

注意:如果是虚函数叫「重写(override)」,不是虚函数就叫「隐藏(hiding)」。


4.static_cast安全向下转型

为什么static_cast<T*>(this)是安全的?

因为this指向的对象实际就是T类型(子类对象),只是当前作用域是基类视角。编译器在编译期就能确认这个转型合法,比dynamic_cast快,不需要 RTTI。


运行结果

Sub ← sub1 自己有 Name(),隐藏了基类版本 Edoyun ← Sub2 没有 Name(),用继承来的基类版本

补充:CRTP 的常见用途

  1. 静态多态
  2. 给子类自动添加功能(如计数器、单例、对象池)
  3. 实现 fluent interface / 链式调用
  4. Mixin 混合类(给类叠加能力)
  5. ATL/WTL 窗口类封装(就是你头文件对应的场景)

简单说:想有多态的效果,但又不想承担虚函数的开销 → 用 CRTP

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

Grok 4.3 AI助手技术解析:多模态能力与焚决功能实践指南

如果你最近在关注AI助手领域&#xff0c;可能会注意到一个有趣的现象&#xff1a;虽然市面上已经有ChatGPT、Claude、Gemini等成熟产品&#xff0c;但Grok这个名字依然频繁出现在技术讨论中。特别是当提到"免费"、"最新版本"、"功能更新"这些关键…

作者头像 李华
网站建设 2026/7/16 9:08:07

memdir:面向IDE的本地化会话状态持久化系统

1. 项目概述&#xff1a;这不是一个“增强记忆”的插件&#xff0c;而是一套可落地的会话状态持久化系统“又一款封神级插件开源&#xff01;彻底解决 Claude Code 记忆短板问题&#xff01;”——看到这个标题&#xff0c;我第一反应不是点开&#xff0c;而是把键盘敲得更响了…

作者头像 李华
网站建设 2026/7/16 9:05:48

Claude Fable在教育内容生成中的优势与实操指南

1. 先搞清楚 Claude Fable 在教育内容生成上的实际优势 Claude Fable 在教育内容生成上超越 Opus&#xff0c;这个结论不是凭空得出的&#xff0c;而是基于它在处理复杂教育场景时的几个关键能力差异。如果你在教育领域工作&#xff0c;无论是课程设计、教学材料生成还是学习路…

作者头像 李华
网站建设 2026/7/16 9:05:19

OpenClaw本地AI工作流引擎:Docker一键部署与API-Key实战指南

1. 项目概述&#xff1a;这不是“装个软件”&#xff0c;而是给你的本地AI大脑装上可编程的爪子 OpenClaw&#xff08;常被社区简称为Clawdbot&#xff09;不是另一个聊天窗口&#xff0c;它是一套面向开发者和进阶用户设计的 本地化AI工作流编排引擎 。你可以把它理解成一个…

作者头像 李华
网站建设 2026/7/16 9:04:48

晶体管开关速度优化与数字电路性能提升实战

1. 晶体管开关速度的基础认知 在数字电路设计中&#xff0c;晶体管的开关速度直接决定了整个系统的性能上限。我曾在设计一款高频信号处理器时&#xff0c;就因为忽视了开关速度的优化&#xff0c;导致整个系统时钟频率被限制在预期值的60%以下。那次教训让我深刻认识到&#x…

作者头像 李华
网站建设 2026/7/16 9:03:53

数字员工怎么选对工具?——P0→P1→P2 三层选择策略

核心论点&#xff1a;数字员工的工具选择不是"让 LLM 猜"&#xff0c;而是一个三层拦截体系——规则过滤→语义匹配→模型确认&#xff0c;85% 的请求在到达 P2 LLM 确认之前&#xff0c;正确意图已被召回至 Top-2 候选。痛点场景 一家银行上线了数字员工客服&#x…

作者头像 李华