在C ++中,我可以多态处理可能会或可能不会在其上调用某些方法的数据

时间:2018-01-28 01:27:11

标签: c++ inheritance polymorphism multiple-inheritance

首先,抱歉这个糟糕的问题标题。我无法找出描述问题的简短方法。

我目前正在尝试用文件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类,我必须继承ReadFileWriteFile类。当然,这会产生钻石问题,因为ReadFileWriteFile都从基础File继承。

我想出了一些解决方案,但没有一个能给我我想要的确切内容。

第一个是虚拟继承。但是,这似乎会给编译的代码增加不必要的开销和vtable s。我不需要任何类型的虚函数,因为我只是在类中添加方法,而不是覆盖它们。

第二个是完全删除继承,而是使用模板和enable_if来有条件地允许在类上调用方法,但这看起来有点矫枉过正,而且非常难以做到。

是否有一种简单的方法可以在没有任何(运行时)开销的情况下对这些文件进行多态处理?毕竟,这可以在编译期间全部解决。

提前致谢。

0 个答案:

没有答案