繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM