提问人:Lorah Attkins 提问时间:6/2/2023 更新时间:6/2/2023 访问量:30
转换为基本引用后basic_istream的非虚拟方法
Non virtual methods of basic_istream after upcasting to base reference
问:
我有一组类,它们派生自 和 喜欢basic_istream
ios_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,因此我假设:dump
eof
read
gcount
- 所有这三个方法都是非虚拟的,因此使用所有需要的状态调用正确的方法。
- 没有内存损坏的影响(试图通过使用地址清理程序编译上面的演示来验证)。
这些假设是否正确,是否有会打破的案例?
我需要为代码库中可用的多个其他流类扩展此逻辑,因此我能找到的唯一危险信号是当一个类重新定义这些方法中的任何一个时,这将导致对基类的引用超出预期。
答: 暂无答案
评论
std::istream
std::basic_istream<char>
while (!stream.eof())
)被认为是错误的?std::istream
std::ostream
std::cin
std::cout