抽象类中的C ++重载虚函数,抽象类引用参数不起作用

时间:2016-12-07 20:36:05

标签: c++ abstract-class pass-by-reference overloading

我有一个像这样定义的树结构(抽象类)

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>&)或任何其他名称重命名insFirstSubtree(node, const Tree<T,N>&),则突然正常

为什么我不能像这样重载这个功能?无论如何还是我必须更改它的名字?

我寻找其他答案,但他们是在不同的科目/案例。

编辑:如何在Derived类中使用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个参数且私有的并且抱怨它是私有的。

1 个答案:

答案 0 :(得分:1)

问题是重载仅适用于在同一范围内定义的函数。 ListTree<string>定义insFirst(node, item),但未定义insFirst(node, const Tree<T,N>&)。因此,对tree.insFirst(tree.root(), tree2)的调用无效,因为在派生类中定义的insFirst的唯一版本无法使用这些参数调用。

正如评论中所提到的,修复是告诉编译器还要使用insFirst(node, const Tree<T,N>&)声明从基类中考虑using,或者,如您所发现的,更改名称基类中的insFirst(node, const Tree<T,N>&),以便可以直接调用它。