【发布时间】:2014-07-26 03:30:42
【问题描述】:
我正在实现一个快速排序算法。我有一个界面
class Comparable{
public:
virtual int compareTo(Comparable *c)=0;
};
现在我有一个名为 ComparableInt 的类,它实现了 Comparable:
class ComparableInt: public algorithm::Comparable{
public:
int value;
int compareTo(Comparable *i) {
ComparableInt *c = dynamic_cast<ComparableInt*>(i);
return value - (*c).value;
};
ComparableInt(int i):value(i){};
};
我的问题是,这是正确的做法吗?我试图这样实现它:
class ComparableInt: public algorithm::Comparable{
public:
int value;
int compareTo(ComparableInt *i) {
return value - (*i).value;
};
ComparableInt(int i):value(i){};
};
但似乎这个 int compareTo(ComparableInt *i) 不是 virtual int compareTo(Comparable *c) 的实现,所以我必须进行动态转换。寻求您的帮助!
【问题讨论】:
-
“本着 STL 精神”的做法是在快速排序中获取任何可调用对象,然后使用两个元素调用它。
-
为什么要使用继承来实现排序?看看here,了解如何使用模板和标准库算法来完成这项工作。
-
这种设计的问题在于,您无法真正控制您正在比较彼此真正可比的事物。它们实际上应该具有相同的派生类型,而不是相同的接口类型。