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



我的用例如下。我有一个纯抽象类和继承类,如下所示:

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 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. 我想要一个解决方案,而不是使用模板类

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

抽象类依赖于虚拟函数来发挥作用。要调用的正确函数是在运行时根据多态对象的实际类型确定的。

您无法从对象数组的多态性中获益。数组需要一个在编译时确定并且可以实例化的类型。这与抽象类不兼容。

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

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

最新更新