转换为基本引用后basic_istream的非虚拟方法

Non virtual methods of basic_istream after upcasting to base reference

提问人:Lorah Attkins 提问时间:6/2/2023 更新时间:6/2/2023 访问量:30

问:

我有一组类,它们派生自 和 喜欢basic_istreamios_base

  • std::stringstream,
  • boost::interprocess::basic_vectorstream,
  • boost::interprocess::bufferstream

在某些时候,所有这些实例都需要转储它们的内容(在下面的示例中用一个简单的模拟):printf

#include <iostream>
#include <sstream>

void dump(std::basic_istream<char> &input)
{
    const int chunk_size = 10;
    char chars[chunk_size];
    
    while (!input.eof()) {
        input.read(chars, chunk_size);
        int nread = input.gcount();
      
        printf("CHUNK: %.*s\n", nread, chars);
    }
}

int main()
{
    std::stringstream ss;
    ss << "Add some content. ";
    ss << "And then some more." << "... and that's it";
    
    foo(ss);
}

演示

由于函数所需的只是 和 ,因此将对基类的引用传递给 dump,因此我假设:dumpeofreadgcount

  1. 所有这三个方法都是非虚拟的,因此使用所有需要的状态调用正确的方法。
  2. 没有内存损坏的影响(试图通过使用地址清理程序编译上面的演示来验证)。

这些假设是否正确,是否有会打破的案例?

我需要为代码库中可用的多个其他流类扩展此逻辑,因此我能找到的唯一危险信号是当一个类重新定义这些方法中的任何一个时,这将导致对基类的引用超出预期。

C++ IOstream 提升互处理

评论

2赞 Some programmer dude 6/2/2023
OT:请注意,这是 的别名。不要写太多需要的东西。:)std::istreamstd::basic_istream<char>
4赞 molbdnilo 6/2/2023
为什么 iostream::eof 在循环条件中(即 while (!stream.eof()))被认为是错误的?
0赞 Some programmer dude 6/2/2023
与您的问题更相关,也许一个好的参考可能会有所帮助?
0赞 molbdnilo 6/2/2023
如果任何功能都是虚拟的,为什么会有问题?您是否认为某处有向基类的转换?
1赞 Some programmer dude 6/2/2023
最后,使用对基本输入或输出流类(或 )的引用是传递流的常见正常标准方法。然后,无论使用字符串流、文件流还是 或任何其他流对象调用函数都无关紧要。std::istreamstd::ostreamstd::cinstd::cout

答: 暂无答案