如何设计我需要在基础 class 中使用派生 class 成员的 class?

How to design class that I need use derived class member in base class?

一般我们使用虚函数或者组合来设计class.As我知道,使用虚函数会让class更有条理;使用组合将很容易实现,但可能会编写更多重复代码。 在这种情况下:我需要一个解析器,它将用于不同的 protocol.Now,我想它将在名为 AParser 的 A-Protocol 中使用,在名为 BParser 的 B-Protocol 中使用,如下所示:

class Parser {
 public:
  Parser(...);
  virtual ~Parser() = default;
  virtual bool Parse(...) = 0;

 private:
  // some attributes may be common
};

class AParser() : public Parser {
 public:
  AParser(...) : Parser() {};
  ~AParser() override = default;

  void bool Parser(...) override;
  inline AData Data() const { return AData_;}

 private:
  AData_;
}

class BParser() : public Parser {
 public:
  BParser(...) : Parser() {};
  ~BParser() override = default;

  void bool Parser(...) override;
  inline BData Data() const { return BData_;}

 private:
  BData_;
}

嗯,ADataBData都是自己的私有数据,不应该放到base class,

另外,不应该virtual AData/BData Data() = 0(错误!!!)

那么,如何设计class来解决问题呢? 现在我有两个想法,但是我觉得都不能让我满意

  1. static_cast<derived_class>(this)->derivedFunc(),一是这个操作不优雅,二是我用这个操作,Inheritance + encapsulation还有意义吗?
  2. 使用普通函数,如virtual std::map<std::string, void *> GetData() = 0,然后使用member field name获取归档数据,但是如何使用派生函数还是个问题?

我认为这个问题可能是一个class设计问题,你能帮我回答一下吗?

如果两个解析器没有 return 相同的数据,则它们没有相关的接口,可能不应该有共同的基础 class。

如果他们做 return 相同的数据,将 GetData 函数放在基础 class 中。或者更好的是,return 数据直接来自 Parse.