1

我想创建一个通用的排序链表。因此,我有一个抽象类 Data,它带有一个纯 operator<(为了方便地对列表进行排序。我相信它被称为比较器。)现在我有一个类 Job,它派生自 Data 并实现了运算符。当我尝试创建工作列表并发现该工作也是抽象的时,问题就出现了。发生这种情况是因为我在 Job 中编写的运算符与 Data 中的签名不完全相同 - 在 data 中:

virtual bool operator<(const Data& other) const =0;

在工作中:

virtual bool operator<(const Job& other) const;

因为我无法将工作与通用数据进行比较,所以我不得不接受工作操作员的工作。但是现在新的操作符只是隐藏了旧的操作符而不是覆盖它(或者因为它是纯粹的而实现它)。如何在不使用向下转换的情况下解决问题?谢谢!编辑:并且没有模板。

4

1 回答 1

3

不使用向下转换......似乎是模板的工作。

您可以直接使用运算符强制执行比较函数,而不必将其声明为 pure 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 */ }
       }
    }
};
于 2012-05-31T19:34:54.740 回答