我目前正在实现用于在c ++中标记支持的类。但是,我对重载运算符和isEqual方法的不同行为有点困惑:
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比较不同于两个复杂对象的比较,甚至不同于双重比较)。后来(在程序中)我不想知道我目前正在看什么样的子标签,我只是想知道它们是否相同。
答案 0 :(得分:1)
这一个:
l1 == l2
正在比较指针。如果l1
和l2
的地址相同,那么这将是正确的。
这一个
l1->isEqual(l2)
正在执行一个返回true
的成员函数。
答案 1 :(得分:1)
我不得不说,读得更好,这是一个相当棘手的答案,因为你讲的是继承和重载运算符。
我的猜测是,如果您不知道它们是完全相同的类,则不应将对象与operator ==进行比较。我应该只在SubLbl中定义:
bool operator == (const SubLbl& l) const {return _something_;}
注意我将一个 SubLbl 类型的对象作为参数。我会避免在Lbl中定义虚拟operator==
,尤其是虚拟时。
另一方面,函数isEqual可以正常。
您可以在此处找到针对不同解决方案的一些灵感:Making operator<< virtual?
这是我的回答
在第一种情况下,您没有调用您定义的运算符,但是您正在检查2个指针指向同一个对象,或者更好,是否具有相同的值。
要致电您的运营商,您应该放置:
cout << (*l1 == l2) << endl;
但是你不建议你定义运算符的方式。例如,您应该定义:
bool operator == (const Lbl& l) const {return _something_;}
并致电
cout << (*l1 == *l2) << endl;