我已经定义了一个类
template <class T> class NodeMap {
NodeMap(int n, T defaultEntry = NULL);
virtual ~NodeMap();
T& operator[](const node& u);
...
}
将node
类型的对象映射到参数类型T
的对象。
现在我想要一个班级Matching
,基本上是NodeMap<node>
。为方便起见,我想添加isProperMatching(Graph& G)
和match(node u, node v)
等方法。 Matching
可以继承NodeMap<node>
吗?是否有可能(如果是的话,这是一个好主意)使用固定模板参数扩展模板类?
答案 0 :(得分:4)
就你所展示的代码而言,你有以下几种可能性告诉我你在做什么:
Nodemap
专门化T=node
,以包含您想要的其他方法。为方便起见,您可以输入Nodemap<node>
到Matching
。但是,这可能会在非专用模板中添加一些代码重复。Nodemap<node>
导出。如果以一种使其成为正确基类的方式设计Nodemap
,这是一种有效的方法。虚拟析构函建议你已经这样做了,尽管可能没有必要让方法虚拟化。Nodemap<node>
我会考虑前两个的混合方法:创建一个包含NodeMapBase
和NodeMap
的常用功能的基类模板(我称之为Matching
),然后从相应的基类模板派生NodeMap
模板(可能没有添加太多功能),并从Matching
派生NodeMapBase<node>
。如果您看一下MSVC的标准库实现,那么您会看到很多。
答案 1 :(得分:2)
是的,这是常用的。
class Matching : public NodeMap<node> {
...
};
答案 2 :(得分:2)
这取决于Matching
的界面应该如何。如果你想提供完全相同的方法加上一些便利方法,你可以继承它
class Matching : public NodeMap<node> {...};
但如果Matching
不是NodeMap<node>
,即提供不同的界面,则只应将其用作聚合
class Matching {
private:
NodeMap<node> matchingNodes;
public:
// public interface of Matching
bool isProperMatching(Graph& G);
bool match(node u, node v);
...
};
顺便说一下,这个建议与NodeMap
是否为模板无关。