从基类对象创建派生类

时间:2013-06-07 12:55:24

标签: c++ inheritance copy-constructor

我有基类,它是某些数据的通用解析器,我有多个派生类,它们为解析器中包含的数据提供特定的访问接口。我只能在解析所有数据后确定派生类的类型,因为它取决于层次结构(有基类树,需要完全填充以确定每个基类的派生类)。

从基类创建派生类的最佳方法是什么,避免不必要的数据复制?截至目前,我正在创建使用base的复制构造函数派生(如下所示):

class Base
{
};

class Derived : public Base
{
  Derived(const Base &base)
  : Base(base)
  {
  }
};

,但这需要复制所有必要的基础数据 - 我希望基类在不复制的情况下派生,如果可能的话删除它。

编辑:

基本解析器解析数据文件并将数据存储为map>,而派生类根据存储的实际数据类型提供特定的访问接口。派生类可能会更改,可以添加更多类。

2 个答案:

答案 0 :(得分:4)

您已经说过必须首先解析所有数据,而这个问题似乎告诉我您使用Base进行解析。 (注意,随后的OP编辑已经确认了这种情况。)

然后,一旦解析完成,您将根据解析的数据从Derived构造Base。这告诉我Derived不仅仅是一个解析器,而是解析数据的某种容器,以及解析数据的一个actor。 (也证实了。)

有一个既解析数据又包含解析数据并对其采取行动的类违反了Principle of Single Resposibility。原则意图被打破,但我认为在这种情况下违反原则会给你带来麻烦。

我的建议是打破你的层次结构。

  • 一个类是解析器,并且不保存任何数据(除了可能用于解析状态)
  • 一个类包含原始的,已解析的数据,没有管理或actor方法。也许就像std::map一样简单。
  • 一个类是actor,它用数据做事。这实际上是一个类层次结构,为不同类型的解析数据提供了不同的类。

工作流程将是这样的:

  1. 实例化解析器。
  2. 解析器实例化原始数据的持有者,并解析数据。
  3. 解析器根据解析的数据构造actor类,并将shared_ptr传递给原始数据容器。
  4. 解析器终止,返回一个指向actor类的指针,该类现在拥有原始解析数据。

答案 1 :(得分:0)

您可以为派生类提供自己的构造函数,并仅解析确定它所需的数据。传递指针也是一个好主意,因为它不涉及内存分配。