首先,抱歉这个糟糕的问题标题。我无法找出描述问题的简短方法。
我目前正在尝试用文件IO编写一个小型库(用于学习目的)。
我的问题是我创建了一个基类File
,它基本上保存了要读取或写入的缓冲区。
它看起来有点像这样(有些事情无关紧要):
class File {
protected:
std::unique_ptr<std::string> contents; // The buffer for reading into/writing from.
size_t pos; // The offset from the beginning of the buffer.
}
当然,我需要添加读写文件/缓冲区的方法。我希望能够以只读,只写或读写方式打开文件。
当我想要这样做时,我的问题出现了,所以如果它是只读,只写或读写,其他对象可以处理文件而无需关心。
执行此操作的合理方法是创建ReadFile
类,如下所示:
class ReadFile : public File {
std::string getAll();
std::string getLine();
char getByte();
};
请注意,此类仅添加方法,而不添加任何其他数据。
同样,我写了一个WriteFile
类:
class WFile : public FileBase {
void putString(const std::string&);
void putByte(char);
void save(const std::string& filename);
}
这个类也只添加方法。
但是,如果我要创建ReadWriteFile
类,我必须继承ReadFile
和WriteFile
类。当然,这会产生钻石问题,因为ReadFile
和WriteFile
都从基础File
继承。
我想出了一些解决方案,但没有一个能给我我想要的确切内容。
第一个是虚拟继承。但是,这似乎会给编译的代码增加不必要的开销和vtable
s。我不需要任何类型的虚函数,因为我只是在类中添加方法,而不是覆盖它们。
第二个是完全删除继承,而是使用模板和enable_if
来有条件地允许在类上调用方法,但这看起来有点矫枉过正,而且非常难以做到。
是否有一种简单的方法可以在没有任何(运行时)开销的情况下对这些文件进行多态处理?毕竟,这可以在编译期间全部解决。
提前致谢。