当前位置: 首页 > news >正文

C++的纯虚类

在 C# 中,有 interfaceabstract class。而在 C++ 中,没有 interface 关键字

C++ 实现接口功能的方式,就是通过纯虚类(Pure Virtual Class),或者更准确地说,是包含纯虚函数的类。


1. 什么是纯虚函数?

在 C++ 中,虚函数(Virtual Function)允许子类重写。而纯虚函数则更进一步:它声明了函数签名,但不提供实现,并强制要求子类必须实现它。

语法非常奇特,是在函数声明后面加一个 = 0

class IShape {
public:// 纯虚函数:没有主体,只有声明virtual void Draw() = 0; // 虚析构函数(在 C++ 纯虚类中至关重要!)virtual ~IShape() {} 
};

为什么是 = 0

这是一个历史遗留的语法符号,你可以把它理解为:“这个函数在虚函数表(VTable)中的条目被初始化为空(NULL)”。


2. 什么是纯虚类(抽象类)?

只要一个类中包含了至少一个纯虚函数,这个类就变成了纯虚类(也叫抽象类)。

  • 不能实例化:你不能写 IShape shape;,编译器会报错,就像 C# 不能 new 一个接口一样。
  • 子类约束:如果子类不实现父类的所有纯虚函数,那么子类也会变成抽象类,同样不能被实例化。

3. C++ 纯虚类 vs C# Interface

作为 C# 开发者,你可以把纯虚类看作是 Interface 和 Abstract Class 的结合体

特性 C# Interface C++ 纯虚类
关键字 interface class + virtual ... = 0
成员变量 不允许(仅属性/方法) 允许(可以带状态数据)
默认实现 较新版本支持 支持(甚至纯虚函数也能有主体,虽然少见)
多继承 一个类可实现多个接口 一个类可继承多个纯虚类
析构函数 无需担心 必须有虚析构函数,否则会内存泄漏

4. 深度陷阱:虚析构函数(Virtual Destructor)

这是 C# 转 C++ 最容易踩的天坑

在 C# 中,GC 会自动清理所有对象。但在 C++ 中,如果你通过父类指针删除子类对象,情况就不同了:

IShape* shape = new Circle(); // Circle 继承自 IShape
delete shape; 
  • 如果 IShape 的析构函数不是 virtual 的:程序只会调用 IShape 的析构函数,而不会调用 Circle 的析构函数。Circle 里的资源(如内存、文件句柄)就泄露了。
  • 准则:只要一个类被设计为基类,它的析构函数就必须virtual 的。

5. 模拟 C# 的 Interface 模式

在 C++ 工程实践中,我们通常遵循“接口类”的规范:

  1. 全都是纯虚函数。
  2. 没有成员变量。
  3. 有一个虚析构函数。
// 模拟 C# 的 IDisposable
class IDisposable {
public:virtual void Dispose() = 0;virtual ~IDisposable() {}
};// 模拟 C# 的 ILogger
class ILogger {
public:virtual void Log(std::string msg) = 0;virtual ~ILogger() {}
};// C++ 支持多继承,所以它可以同时实现这两个“接口”
class FileLogger : public IDisposable, public ILogger {
public:void Dispose() override { /* 关闭文件 */ }void Log(std::string msg) override { /* 写入文件 */ }
};

总结

  • 纯虚函数:用 virtual ... = 0; 定义,强制子类实现。
  • 纯虚类:含有纯虚函数的类,不能被实例化,充当“契约”或“接口”。
  • 核心差异:C++ 纯虚类可以包含数据成员和普通成员函数,比 C# Interface 更像 Abstract Class。
  • 必做事项:永远为你的纯虚类写一个 virtual ~ClassName() {}
http://www.jsqmd.com/news/408977/

相关文章:

  • 大模型面经——LoRA大模型微调秘籍:小白也能轻松掌握,收藏必备!
  • 收藏这份“多模型炼蛊”SOP,快速掌握大模型精髓,开启AI生财之路!
  • 小白程序员必看:AgentOS如何引领AI计算范式升级
  • 万字死磕:大模型千万并发引爆OOM?异构网关高可用重构实战
  • 2026成都及周边最新艺体生文化课集训学校TOP5推荐:优质机构权威榜单发布,精准助力提分 - 十大品牌榜
  • 面对蜂拥而至的医疗AI公司,我作为科室主任,只问三个问题
  • 小白程序员轻松上手RAG,让AI精准回答你的私有文档问题!
  • 跨境平台竞争下,卖家自养买家号测评如何安全高效操作?
  • 仪表选型|针对“清水+复杂混合液”的双重挑战,有什么好的解决方案吗?
  • Shadcn UI:颠覆传统组件库,开启前端开发新范式
  • 喜报丨唐山大方公司液态金属在线检测传感器产品成功中标
  • 口碑好的执业医师培训机构有哪些? - 医考机构品牌测评专家
  • 分享一套锋哥原创的AI大模型微调训练 微博舆情分析可视化系统(pytorch2+基于BERT大模型训练微调+flask+pandas+echarts),非常Nice,界面非常好看
  • 《数据挖掘》期刊推介征稿指南
  • 2026成都及周边数学培训提分培训机构TOP5推荐:精准适配小班/择校考试等场景,助力快速提分 - 十大品牌榜
  • 考临床执医听谁的课? - 医考机构品牌测评专家
  • 开发日志7
  • 从BIOS到UEFI:解锁虚拟机性能的终极指南
  • 23.行为型 - 访问者模式 (Visitor Pattern)
  • Rsync 性能优化实战:从慢速同步到高效传输的深度调优
  • 学习笔记:第二类斯特林数
  • 2026年洁净车间净化品牌排行,前六款青岛实验室净化工程实力制造商推荐 - 睿易优选
  • 一文学习 Spring AOP 源码全过程
  • TDesign:腾讯出品的“大一统”UI组件库,让企业级开发不再“选择困难”
  • 俄罗斯方块谁不会做......啊?流沙版?
  • 一文学习 Spring AOP 源码过程
  • 洛谷题单指南-基础线性代数-P2520 [HAOI2011] 向量
  • 部署 Squid 集群 + Nginx 虚拟主机,实现 Web 页面缓存与完整校验
  • C++中的std::move 和 lambda 之三
  • 2026年无纺布产品推荐,包装无纺布厂家、汽车用无纺布厂家TOP排行 - 睿易优选