我的用例如下。我有一个纯抽象类和继承类,如下所示:
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
}
我应该如何实现这一点?
限制条件:
- 为了提高运行时效率,我希望使用固定大小的数组,而不是动态内存分配(
new
或智能指针( - 我想要一个解决方案,而不是使用模板类
我目前正在使用模板,但我想知道是否有更好的方法。
抽象类依赖于虚拟函数来发挥作用。要调用的正确函数是在运行时根据多态对象的实际类型确定的。
您无法从对象数组的多态性中获益。数组需要一个在编译时确定并且可以实例化的类型。这与抽象类不兼容。
如果你想要一个带有抽象类的数组,你必须选择一个指针数组。通常,您会使用unique_ptr
或shared_ptr
,以避免内存管理中出现意外。如果您愿意,可以使用new
/delete
,但风险自负。
如果您喜欢模板并且担心动态内存分配的性能,您可以看看Alexandrescu的Modern C++设计。