如果我具有以下C++类:

class FileIOBase
{
  //regular file operations
  //
  //virtual fstream / ifstream / ofstream getStream();  ???
  //
  bool open(const std::string &path);
  bool isOpen() const;
  void close();
  ...
};

class InputFile : FileIOBase
{
  size_t read(...);
  ifstream getStream();
};

class OutputFile : FileIOBase
{
  size_t write(...);
  ofstream getStream();
};

class InputOutputFile : virtual InputFile, virtual OutputFile
{
  fstream getStream();
};

这些类仅封装标准的输入,输出,输入/输出文件流及其操作。

有什么方法可以使getStream()成为接口(interface)的一部分并将其移至FileIOBase吗?

最佳答案

我认为您的意思是使这些返回值引用而不是值。如果是这种情况,则可以在基类中让getStream返回ios&,然后可以让特定函数返回fstream&ifstream&ofstream&,因为它们与ios&协变:

class FileIOBase
{
  ...
  bool open(const std::string &path);
  bool isOpen() const;
  void close();

  virtual ios& getStream() = 0;
  ...
};

class InputFile : FileIOBase
{
  size_t read(...);
  ifstream& getStream();
};

class OutputFile : FileIOBase
{
  size_t write(...);
  ofstream& getStream();
};

class InputOutputFile : virtual InputFile, virtual OutputFile
{
  fstream& getStream();
};

10-08 13:19