C++ 重载抽象 class 中的虚函数,抽象 class 引用参数不起作用
C++ overload virtual function in abstract class with abstract class reference parameter not working
我有一个树结构(抽象class)定义如下
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>&)
有一个抽象的实现 class。
其派生 class,仅实现 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>&)
或任何其他名称,它突然 有效 。
为什么我不能像这样重载这个函数?无论如何还是我必须更改它的名称?
我寻找其他答案,但它们在不同的 subjects/cases.
编辑:如何在 Derived class 中使用 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 个参数和私有的参数,并抱怨它是私有的。
问题是重载只适用于定义在相同范围内的函数。 ListTree<string>
定义了 insFirst(node, item)
,但没有定义 insFirst(node, const Tree<T,N>&)
。所以对 tree.insFirst(tree.root(), tree2)
的调用是无效的,因为在派生 class 中定义的唯一版本 insFirst
不能用这些参数调用。
正如评论中提到的那样,修复方法是告诉编译器还考虑使用 using
声明从基础 class 开始 insFirst(node, const Tree<T,N>&)
,或者,如您所见发现,把baseclass里面的insFirst(node, const Tree<T,N>&)
改个名字,这样就可以直接调用了
我有一个树结构(抽象class)定义如下
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>&)
有一个抽象的实现 class。
其派生 class,仅实现 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>&)
或任何其他名称,它突然 有效 。
为什么我不能像这样重载这个函数?无论如何还是我必须更改它的名称?
我寻找其他答案,但它们在不同的 subjects/cases.
编辑:如何在 Derived class 中使用 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 个参数和私有的参数,并抱怨它是私有的。
问题是重载只适用于定义在相同范围内的函数。 ListTree<string>
定义了 insFirst(node, item)
,但没有定义 insFirst(node, const Tree<T,N>&)
。所以对 tree.insFirst(tree.root(), tree2)
的调用是无效的,因为在派生 class 中定义的唯一版本 insFirst
不能用这些参数调用。
正如评论中提到的那样,修复方法是告诉编译器还考虑使用 using
声明从基础 class 开始 insFirst(node, const Tree<T,N>&)
,或者,如您所见发现,把baseclass里面的insFirst(node, const Tree<T,N>&)
改个名字,这样就可以直接调用了