首页 > 后端开发 > C++ > 为什么你不应该从 C 中的 std::string 继承?

为什么你不应该从 C 中的 std::string 继承?

DDD
发布: 2024-12-17 02:44:25
原创
577 人浏览过

Why Should You Never Inherit from std::string in C  ?

为什么应该避免从 std::string 派生

Scott Meyers 在他的《Effective C》一书中建议不要从 std::string 派生: :string 类,主要是因为它缺少虚拟析构函数。然而,这并不是避免此类继承的唯一原因。

定义继承标准

要充当适当的基类,类必须:

  • 启用多态性:继承旨在派生类表现出特殊行为的多态情况。
  • 避免切片问题:C 中的值类型与 Java 或 C# 中的引用类型不同,它可能仅复制部分数据,从而加剧了切片问题。派生类,导致数据不一致。

std::string 作为 Base Class

std::string 无法满足这些条件,原因如下:

  • 缺少虚拟析构函数: 当类没有虚拟析构函数,派生类继承非虚拟析构函数,这可能会导致通过基类删除对象时出现意外行为指针。
  • 缺乏可重用性: std::string 并未设计为基类,主要关注其作为字符串容器的功能。使用非友元、非成员函数或组合是添加附加功能的更合适的替代方案。

此外,即使在继承只是为了可重用性的情况下,C 也缺乏阻止客户端创建的机制使用基类指针的派生类的对象。这可能违反了限制此类使用的预期目的。

违反继承的后果

忽略这些准则可能会导致代码:

  • 较难理解:违反继承的固有目的会导致混乱和维护困难。
  • 容易出错:可能会出现切片问题和不正确的类型转换,从而导致运行时错误。
  • 效率较低:切片副本引入了不必要的对象副本,影响性能。

综上所述,C 中的继承应保留用于多态情况,并且由于其设计限制和切片问题, std::string 不应用作基类。采用非成员函数或组合等替代方法可以促进惯用的 C 实践并确保代码的清晰度和可靠性。

以上是为什么你不应该从 C 中的 std::string 继承?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板