[英]C++ overload virtual function in abstract class with abstract class reference parameter not working
我有一个像这样定义的树结构(抽象类)
template<class T, class N>
class Tree {
public:
typedef T item;
typedef N node;
virtual node root();
...
virtual void insFirst(node, const Tree<T,N>&);
virtual node insFirst(node, item) = 0;
...
private:
virtual void insFirst(node, const Tree<T, N>&, node, bool);
}
如您所料, insFirst(node, const Tree<T,N>&)
在抽象类中有一个实现。
它的派生类仅实现insFirst(node, item)
。
当我从以下位置致电insFirst
时:
ListTree<string> tree;
ListTree<string> tree2;
... // initialization
tree.insFirst(tree.root(), tree2); // CALL
我收到编译器错误
No viable conversion from 'ListTree<string>' (aka 'ListTree<basic_string<char, char_traits<char>, allocator<char> > >') to 'item' (aka 'std::__1::basic_string<char>')
发生这种情况是因为它引用的是insFirst(node, item)
而不是另一个。
但是,如果我在insFirst(node, const Tree<T,N>&)
中重命名insFirst(node, const Tree<T,N>&)
insFirstSubtree(node, const Tree<T,N>&)
或任何其他名称,则它突然起作用 。
为什么不能像这样重载此函数? 无论如何,还是我必须更改其名称?
我在寻找其他答案,但它们的主题/案例不同。
编辑:如何使用using Tree<T,ListNode<T>>::insFirst;
在派生类中有2个不同的insFirst? ( insFirst(node, const Tree<T,N>&)
和insFirst(node, const Tree<T,N>&, node, bool)
。C ++(Xcode)默认选择带有4个参数的参数,并且private和抱怨它是私人的。
问题是重载仅适用于在相同范围内定义的函数。 ListTree<string>
定义了insFirst(node, item)
,但没有定义insFirst(node, const Tree<T,N>&)
。 所以对tree.insFirst(tree.root(), tree2)
的调用是无效的,因为在派生类中定义的insFirst
的唯一版本不能用这些参数调用。
如注释中所提到的,此修补程序是告诉编译器还using
声明考虑基类中的insFirst(node, const Tree<T,N>&)
,或者,如您insFirst(node, const Tree<T,N>&)
,更改基类中insFirst(node, const Tree<T,N>&)
,以便可以直接调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.