gpt4 book ai didi

c++ - 通过继承扩展 C++ 标准库?

转载 作者:太空宇宙 更新时间:2023-11-04 13:42:22 24 4
gpt4 key购买 nike

人们普遍认为 C++ 标准库通常不打算使用继承进行扩展。当然,我(和其他人)批评过那些建议从诸如 std::vector 类派生的人。然而,这个问题:c++ exceptions, can what() be NULL?让我意识到标准库中至少有一个部分旨在如此扩展 - std::exception

所以,我的问题分为两部分:

  1. 是否有任何其他旨在从中派生的标准库类?

  2. 如果确实派生自标准库类,例如 std::exception,是否受 ISO 标准中描述的接口(interface)约束?例如,一个程序使用了一个异常类,该异常类的 what() 成员函数没有返回 NTBS(假设它返回了一个空指针)是否符合标准?

最佳答案

很好很好的问题。我真的希望标准能更明确地说明预期用途是什么。也许应该有一个与语言标准并存的 C++ 基本原理文档。无论如何,这是我使用的方法:

(a) 我不知道存在任何此类列表。相反,我使用以下列表来确定标准库类型是否可能被设计为继承自:

  • 如果它没有任何虚拟 方法,那么您不应该将它用作基础。这排除了 std::vector 等。
  • 如果它确实有 virtual 方法,那么它可以用作基类。
  • 如果周围有很多 friend 语句,请避开,因为可能存在封装问题。
  • 如果它是一个模板,那么在继承它之前仔细观察,因为您可能可以使用专门化来自定义它。
  • 基于策略的机制(例如,std::char_traits)的存在是一个很好的线索,表明您不应将其用作基础。

不幸的是,我不知道有一个很好的综合列表或黑白 列表。我通常凭直觉。

(b) 我会申请 LSP这里。如果有人在您的异常上调用 what(),那么它的可观察行为应该与 std::exception 的行为相匹配。我不认为这实际上是一个标准一致性问题,而是一个正确性问题。该标准不要求子类可替代基类。这实际上只是一个“最佳实践”

关于c++ - 通过继承扩展 C++ 标准库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27301242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com