【问题标题】:Should I avoid inheriting from std::iostream?我应该避免从 std::iostream 继承吗?
【发布时间】:2013-11-19 19:52:16
【问题描述】:

我正在编写一个可以读/写特定格式文本文件的类。我考虑从std::iostream 继承,但是在用Google 搜索时,我发现了一些我不应该从std::iostream 继承的cmets/suggestions。

有什么理由我应该避免直接从std::iostream 继承?我应该继承更底层的东西吗,比如std::basic_iostream

【问题讨论】:

  • 总的来说,我认为与其继承,不如简单地拥有一个std::iostream 作为成员。
  • @JonathanMee 你可能是对的;这是旧的 has-ais-a 论点。由于我的课程将直接读取/写入文件,我认为它更多地落在has-a 方面,所以我想尝试继承。
  • 为了提供任何类型的格式化程序,我更喜欢使用 std::ostreamstd::istream 引用的类。
  • '所以我想尝试继承'这肯定会让正确的实现变得更加困难。
  • 从技术上讲,继承的主要问题是析构函数不是虚拟的。在std::basic_iostream 的情况下,析构函数是虚拟的,因此可以毫无问题地从它继承。事实上,你应该做的只是应用合成。

标签: c++ inheritance iostream


【解决方案1】:

iostream 获取各种格式的数据,并将其转换为发送到流缓冲区的字节流。它大部分通过在相关区域设置中调用格式化函数来完成此操作(例如,决定数字是否应表示为1.234,561,234.561234.56 取决于区域设置)。

根据语言环境对数据进行格式化后,它会被写入流缓冲区。流缓冲区将格式化数据转换为适合外部文件的格式(例如,处理 UTF-8、UTF-16 和 ISO-8859)。

因此,您几乎不可能通过更改 iostream 来更改格式。如果您想更改单个项目的格式,您可以通过更改语言环境来实现。如果您想更改将结果转换为外部文件格式的方式,您需要更改文件缓冲区。

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 2014-05-26
    • 2012-10-14
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多