如何在C++中实现抽象数组类?

How to implement arrays of abstract classes in C++?

我的用例如下。我有一个纯粹的抽象 class 并且像这样继承了 classes:

class AbstractCell {
public:
   // data members
   virtual void fn () = 0;  // pure virtual functions
}

class DerivedCell1 : public AbstractCell {
public:
  // more data members
  void fn () {}  // implementation of all virtual functions
}

class DerivedCell2 : public AbstractCell {
public:
  // more data members
  void fn () {}  // implementation of all virtual functions
}

现在,我想创建一个抽象数组 class 作为另一个 class 的成员。

class AbstractGrid {
public:
  AbstractCell m_cells [10][10];  //  this is illegal
  
  void printCells() {
      // accesses and prints m_cells
      // only uses members of AbstractCell
  }
}

class DerivedGrid1 : public AbstractCell {
public:
  DerivedCell1 m_cells [10][10];  // I want this class to use DerivedCell1 instead of AbstractCell
}

class DerivedGrid2 : public AbstractCell {
public:
  DerivedCell2 m_cells [10][10];  // I want this class to use DerivedCell2 instead of AbstractCell
}

我应该如何实现这一目标?

约束条件:

  1. 为了提高运行时效率,我想使用固定大小的数组,而不是动态内存分配(new或智能指针)。
  2. 我想要一个解决方案,而不是使用模板 classes.

我目前正在使用模板,但我想知道是否有更好的方法。

抽象类 依赖虚函数才有用。要调用的正确函数是在运行时根据多态对象的实际类型确定的。

您无法从对象数组的这种多态性中获益。数组需要在 compile-time 处确定并且可以实例化的类型。这与抽象 类.

不兼容

如果你想要一个抽象的数组类,你必须去寻找一个指针数组。通常,您会使用 unique_ptrshared_ptr,以避免内存管理中的意外。如果您愿意,可以使用 new/delete,但风险自负。

如果您喜欢模板并且担心动态内存分配的性能,您可以看看 Alexandrescu 的 Modern C++ design