首页 >后端开发 >C++ >你应该从 `std::string` 派生吗?

你应该从 `std::string` 派生吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-11 18:27:12987浏览

Should You Derive from `std::string`?

从 std::string 类派生是一种误导性的做法吗?

在《Effective C》中,建议不要从 std::string 派生string 类主要是因为它缺少虚拟析构函数。这种配置引起了一些关于适合作为基类的类的具体要求的混乱。

与类必须有资格继承才能充当非多态基类的假设相反,C提供代码重用的替代机制。例如,私有继承可以促进混合或面向方面的编程,而公共继承专门用于多态场景。

不鼓励从 std::string 派生的普遍原因在于值类型和引用之间的区别C 中的类型。与 Java 和 C# 不同,C 类是值类型,这意味着在继承操作期间执行逐值复制。因此,当派生类与基类具有不同的内存占用时,就会出现切片问题,从而导致意外行为和潜在的不一致。

为了缓解此问题,应优先考虑非成员和非友元函数用于扩展功能。如果认为继承是必要的,则应采用组合或模板元编程来避免与切片相关的陷阱。

总而言之,不建议从 std::string 派生,因为它缺少虚拟析构函数并且与 C 中的值类型继承相关的固有复杂性。

防止非多态用法

如果基类仅用于代码重用而不是用于多态目的,则没有简单的机制来阻止客户端直接通过指针或引用实例化派生类。然而,利用 static_assert 或类型特征技术可以提供运行时检查来检测不合格的使用情况。

以上是你应该从 `std::string` 派生吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn