22 November 2022

C++ 核心指南目录

C.87: Beware of == on base classes

理由

在类层级中,我们很难写出万无一失的有用的==操作。

例子

class B {
    string name;
    int number;
public:
    virtual bool operator==(const B& a) const
    {
         return name == a.name && number == a.number;
    }
    // ...
};

B 的比较操作会接受第二个参数的类型转换,但是其自身不做类型转换。

class B {
    string name;
    int number;
public:
    virtual bool operator==(const B& a) const
    {
         return name == a.name && number == a.number;
    }
    // ...
};
class D : public B {
    char character;
  public:
    virtual bool operator==(const D& a) const
        {
            return B::operator==(a) && character == a.character;
        }
    // ...
};

int main()
{
    B b = B();
    D d = D();
    cout << (b == d) << endl;
    // return b.name == d.name && b.number == d.number;
    // compares name and number, ignores d's character
    cout << (d == b) << endl;
    // return d.name == b.name && d.number == b.number;
    // compares name and number, ignores d's character
    D d2;
    cout << (d == d2) << endl;
    // return d.name == d2.name && d.number == d2.number
    //        && d.character == d2.character
    // compares name, number, and character
    B& b2 = d2;
    cout << (b2 == d) << endl;
    // return b2.name == d.name && d2.number == d.number;
    // compares name and number, ignores d2's and d's character
}
1
1
0
0

当然也有办法可以让==在类层级中工作,但是不太具有扩展性。

注意

此规则应用与其他各种比较操作。

强化

标记virtual operator==()以及其他各种比较操作符。 !=, < <=, >, >=, <=>.