IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:多态

共 2 篇相关文章

IT 累计浏览 3,790

“C++的数组不支持多态”?

这篇博客澄清了一个关于“C++数组不支持多态”的常见误解,作者从微博上的一场讨论切入。文章指出,争议的核心在于对C/C++内存布局的理解差异。当使用 `Base* p = new Derived[n]` 时,删除操作能否正确调用派生类析构函数,并非语言本身的缺陷,而是涉及指针类型转换后,数组步长与对象内存布局是否匹配的根本问题。 作者通过对比C和C++进行了深入分析。在C语言中,不同大小的结构体数组被强制转型会导致严重的内存访问越界和数据混乱,这纯粹是内存模型问题。但在C++中,由于编译器通常将虚函数表指针置于对象起始位置,并且在内存对齐规则下,只要派生类大小不小于基类,数组的物理步长就是安全的。文章通过具体的代码示例和内存调试,展示了在特定内存布局下(例如派生类大小不超过基类),上述C++代码反而能正确执行。 最终,文章揭示了所谓“坑”的本质:它混淆了C语言中数组指针转换的危险性和C++对象模型的特殊性。关键在于理解对象的内存布局,而非简单断言语言特性的有无。这提醒开发者,需要扎实掌握底层内存知识,才能准确区分语言设计、编译器实现和编码错误之间的边界。

IT 累计浏览 2,795

状态模式和策略模式的比较

这篇讲的是经典设计模式中容易被混淆的“双胞胎”——状态模式与策略模式。它们都通过多态将操作分派到一组类中,代码结构几乎一模一样,但作者从意图和应用场景上切入,点明了核心差异:状态模式关注的是对象内部状态的流转与行为切换,而策略模式则聚焦于外部算法或行为的选择与替换。 文章通过具体代码对比指出,虽然两者都依赖接口和实现类,但状态模式的状态对象通常持有上下文引用并能自主触发状态变更,形成一条隐形的“状态链”;策略模式的策略对象则更加独立,由客户端在运行时显式选定并注入,更像可插拔的“算法插件”。这种细微的设计思想差别,决定了前者更适合解决对象生命周期中复杂的内在状态管理问题(如订单流程),后者则擅长应对同一问题下多种可选算法或规则的灵活切换(如支付方式选择)。 理解这种“形似而神异”的区别,能帮助我们在设计时避免误用,让模式真正为业务逻辑服务。