我有一个抽象类Node
其中包含纯虚拟方法存根matches
,需要另一个实例Node
(即子类化的事物的实例Node
) 作为参数。
class Node; // forward declaration
class Node {
public:
Node() : parentNode(this) {}
virtual ~Node() {}
Node* parentNode;
virtual bool matches(const Node& node) const = 0;
};
我该如何实施matches
在子类中,参数可以是子类类型,而不是Node
?
例如。我希望将以下内容注册为合同的实施版本Node
,这样我就可以访问NodeImpl
特定属性作为函数的一部分,否则我将无法执行此操作:
class NodeImpl : public Node {
private:
int foo;
...
};
...
bool NodeImpl::matches(const NodeImpl& n) const {
return this->foo == n.foo;
}
(我确实尝试过使用模板来实现这种效果,但我不确定我做得是否正确。我发现自己在我的代码中传播模板并遇到了无数错误,并且希望在我浪费更多时间在可能也是错误的做事方法上之前,先了解正确的方法到底是什么。)
我尝试的是:
template <class T>
class Node;
template <class T>
class Node {
public:
Node() : parentNode(this) {}
virtual ~Node() {}
Node* parentNode;
virtual bool matches(const T& node) const = 0;
};
这样我就可以在模板函数中一般调用匹配项,如下所示:
template <class T>
void pathComp(Node<T>& currNode, Node<T>& rootNode) {
Node<T> *node = &currNode;
while (node->matches(rootNode)) {
...
}
}
我无法完全让这种方法发挥作用,而且我不喜欢我似乎必须有的方式class NodeImpl : public Node<NodeImpl>
作为我的遗产,这件事似乎不太对劲。任何关于我是否正确的建议都会很棒!