我目前正在實現C++標籤支持類。不過,我有點困惑的不同的行爲重載運營商的isEqual和方法:C++運算符與方法重載及其不同的行爲
class Lbl
{
public:
virtual bool operator == (const Lbl* l) const = 0;
virtual bool isEqual (const Lbl* l) const = 0;
};
class SubLbl : public Lbl
{
public:
SubLbl(){}
bool operator == (const Lbl* l) const {return true;}
bool isEqual (const Lbl* l) const {return true;}
};
int main(int argc, char** argv) {
SubLbl* l1 = new SubLbl();
SubLbl* l2 = new SubLbl();
cout << (l1 == l2) << endl;
cout << (l1->isEqual(l2)) << endl;
return 0;
}
輸出:
0
1
這是爲什麼?我該如何改變這個以使操作符重載?爲什麼我必須繼承「public」以使「isEqual」方法可訪問?或者,這僅僅是我迄今爲止還沒有使用(並且不知道)的模板的典型情況?
我正在做的是實現不同的SubLbl類來支持我可以放在對象上的不同類型的標籤。所有(SubLbl類)都從Lbl類繼承,並且應該由於它們自己的相等定義而重載相等運算符(int比較不同於兩個複雜對象的比較,甚至不同於雙重比較)。後來(在程序中)我不想知道我目前正在查看哪種子標籤,我只是想知道它們是否平等。
值得注意的是'* L1 == * l2' *將*調用重載運算符。 –
@AlexShesterov我不這麼認爲:操作符期望一個指針,調用'(* l1 == l2)'會做,我不認爲這是期望的行爲。 – Antonio
@Antonio:哦......對......我沒有注意到簽名中的'*'(代替了通常的'&')... –