我會實現它是這樣的:
class A{
int a;
public:
virtual int Compare(A *other);
};
class B : A{
int b;
public:
/*override*/ int Compare(A *other);
};
int A::Compare(A *other){
if(!other)
return 1; /* let's just say that non-null > null */
if(a > other->a)
return 1;
if(a < other->a)
return -1;
return 0;
}
int B::Compare(A *other){
int cmp = A::Compare(other);
if(cmp)
return cmp;
B *b_other = dynamic_cast<B*>(other);
if(!b_other)
throw "Must be a B object";
if(b > b_other->b)
return 1;
if(b < b_other->b)
return -1;
return 0;
}
這是非常相似的IComparable
模式在.NET中,它工作得很好。
編輯:
一個警告上述是a.Compare(b)
(其中a
是A和b
是B)可以返回平等,並且將從未拋出異常,而b.Compare(a)
意願。有時候這就是你想要的,有時候不是。如果不是,那麼你可能不希望您的Compare
功能是虛擬的,或者你想在基礎Compare
功能比較type_info
S,如:
int A::Compare(A *other){
if(!other)
return 1; /* let's just say that non-null > null */
if(typeid(this) != typeid(other))
throw "Must be the same type";
if(a > other->a)
return 1;
if(a < other->a)
return -1;
return 0;
}
注意,派生類Compare
功能別因爲他們應該調用基類的Compare
,其中type_info
將發生比較。但是,您可以使用static_cast
替代覆蓋的Compare
函數中的dynamic_cast
。
不,使用==運算符是有意義的。這就是它的目的。不需要比較功能。 – jalf 2008-11-16 17:34:18
@jalf我認爲他希望做比strcmp()更大,更小,更小的比較。注意Compare()返回一個int值,而不是一個bool值。 – 2009-05-08 20:48:31