C ++运算符与方法重载及其不同的行为

时间:2013-06-25 06:32:27

标签: c++ methods overloading operator-keyword

我目前正在实现用于在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比较不同于两个复杂对象的比较,甚至不同于双重比较)。后来(在程序中)我不想知道我目前正在看什么样的子标签,我只是想知道它们是否相同。

2 个答案:

答案 0 :(得分:1)

这一个:

l1 == l2

正在比较指针。如果l1l2的地址相同,那么这将是正确的。

这一个

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;