如何在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
}
我应该如何实现这一目标?
约束条件:
- 为了提高运行时效率,我想使用固定大小的数组,而不是动态内存分配(
new
或智能指针)。
- 我想要一个解决方案,而不是使用模板 classes.
我目前正在使用模板,但我想知道是否有更好的方法。
抽象类 依赖虚函数才有用。要调用的正确函数是在运行时根据多态对象的实际类型确定的。
您无法从对象数组的这种多态性中获益。数组需要在 compile-time 处确定并且可以实例化的类型。这与抽象 类.
不兼容
如果你想要一个抽象的数组类,你必须去寻找一个指针数组。通常,您会使用 unique_ptr
或 shared_ptr
,以避免内存管理中的意外。如果您愿意,可以使用 new
/delete
,但风险自负。
如果您喜欢模板并且担心动态内存分配的性能,您可以看看 Alexandrescu 的 Modern C++ design。
我的用例如下。我有一个纯粹的抽象 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
}
我应该如何实现这一目标?
约束条件:
- 为了提高运行时效率,我想使用固定大小的数组,而不是动态内存分配(
new
或智能指针)。 - 我想要一个解决方案,而不是使用模板 classes.
我目前正在使用模板,但我想知道是否有更好的方法。
抽象类 依赖虚函数才有用。要调用的正确函数是在运行时根据多态对象的实际类型确定的。
您无法从对象数组的这种多态性中获益。数组需要在 compile-time 处确定并且可以实例化的类型。这与抽象 类.
不兼容如果你想要一个抽象的数组类,你必须去寻找一个指针数组。通常,您会使用 unique_ptr
或 shared_ptr
,以避免内存管理中的意外。如果您愿意,可以使用 new
/delete
,但风险自负。
如果您喜欢模板并且担心动态内存分配的性能,您可以看看 Alexandrescu 的 Modern C++ design。