我想创建一个通用的有序链表。因此,我有一个抽象类Data,带有一个纯运算符< (为了便于对列表进行排序。我相信它被称为comperator。)现在我有一个类Job,它派生自Data并实现运算符。当我尝试创建一份工作清单并发现工作也是抽象的时,问题就出现了。之所以发生这种情况,是因为我在Job中编写的运算符与数据中没有完全相同的签名 - 在数据中:
virtual bool operator<(const Data& other) const =0;
并且在工作中:
virtual bool operator<(const Job& other) const;
我不得不接受工作经营者的工作,因为我无法将工作与一般数据进行比较。但是现在新的运算符只是隐藏旧的运算符而不是覆盖它(或者实现它,因为它是纯粹的)。 如何在不使用向下转换的情况下解决问题? 谢谢! 编辑:没有模板。
答案 0 :(得分:3)
不使用向下转换......似乎是模板的工作。
您可以直接使用运算符强制执行比较函数,而不必将其声明为纯virtual
。它也是通用的。
结果相同,方法不同。更灵活,因为您不必从某些东西派生(如果您开始使用多重继承, 会变得很痛苦。)
template<typename T>
class SortedLinkedList
{
T* head;
void insertItem(const T& item)
{
T* currentNode = head;
//iterate
{
if ( *currentNode < item ) // force implementation of operator <
{ /* whatever */ }
}
}
};