调用超类方法运算符==

Moo*_*igo 0 c++ inheritance g++

我正在经历从Java到C++的过渡,我正在尝试编写一个简单的程序.

有一个超类,Animal具有以下接口:

class Animal
{
public:
    Animal(int a, std::string n);

    bool operator==(Animal a);
private:
    int age;
    std::string name;
};
Run Code Online (Sandbox Code Playgroud)

它的子类Dog:

class Dog : public Animal
{
public:
    Dog(int a, std::string n, double w);

    bool operator==(Dog d);
private:
    double weight;

};
Run Code Online (Sandbox Code Playgroud)

我的问题是关于狗的operator==方法,比较2只狗.

动物operator==在下面.

bool Animal::operator==(Animal a) //overriding of operator ==
{
return (age==a.age) && (name==a.name);
}
Run Code Online (Sandbox Code Playgroud)

现在我想用Animal的方法编写Dog的版本.

就像我用Java做的那样:

boolean equals(Dog d){
    return (super.equals(d)) && (this.name==d.name); 
}
Run Code Online (Sandbox Code Playgroud)

我需要的是c ++相当于(super.equals(d)).如果它是一个具有普通名称的方法,那将很容易(Animal :: equals(d)),但我不知道如何为operator ==执行此操作,它具有不同的语法.

Moo*_*uck 6

这实际上非常简单:

return Animal::operator==(d) && name==d.name;
Run Code Online (Sandbox Code Playgroud)

使用超类的名称而不是super在C++中你可以有多个超类的原因,所以你必须清楚你想要哪一个.

或者,您可以通过使用它的过载来调用它:

return ((Animal&)*this)==d && name==d.name;
Run Code Online (Sandbox Code Playgroud)

由于operator==在这种情况下的参数将是a Animal&和a Dog&,因此它不能匹配Dog::operator==(Dog d),因此使用Animal::operator==(Animal a).

注意:您的签名非常不寻常.相反,使用以下之一:

bool operator==(const Animal& a) const;
friend bool operator==(const Animal& left, const Animal& right);
Run Code Online (Sandbox Code Playgroud)

这些不会在每次比较时制作动物的副本,并且可以比较const动物.