【发布时间】:2014-12-04 10:40:56
【问题描述】:
我有以下类定义:
class BaseHandle { /* Lots of things */ };
class VertexHandle : public BaseHandle {
/* Only static members and non-virtual functions, default dtor */ };
class EdgeHandle : public BaseHandle { /* Dito */ };
class FaceHandle : public BaseHandle { /* Dito */ };
所有类都没有虚函数或基。
派生类只派生自BaseHandle,不添加任何非静态成员,也不添加非默认dtor。
我想将Vertex-、Edge-和FaceHandles保存在同一个向量中:
std::vector<BaseHandle*> handles;
但它不起作用,如果我检索 BaseHandle 对象并想将它们 dynamic_cast 到派生对象它会失败,因为类不是多态的(这是我的解释,也许我错了)。
如何实现BaseHandles 的公共向量?我应该提一下,我不能更改类定义,因为它们是第三方库的一部分。
【问题讨论】:
-
要使多态类工作,您至少需要 一个 虚函数:析构函数。
-
您可以创建自己的并行类层次结构并将这些类型中的每一个添加为成员。
-
您的问题有解决方案。使用虚函数。
typeid和static_cast的组合属于问题域而不是解决方案域。您正在重新发明旧的疲惫的class BaseHandle { int TYPE; ... }; switch (TYPE) { ...成语,众所周知,这是一个巨大的混乱。 -
是否有任何派生类有额外的成员,分别比
BaseHandle更多的基类?他们中的任何一个都有用户定义的 dtors 吗? -
如果您必须
dynamic_cast某些东西才能使用它,这通常表示设计不佳。我怀疑这些对象是否属于同一个vector。
标签: c++