继承和覆盖虚拟分配==运算符

时间:2018-11-27 15:08:45

标签: c++ operator-overloading

我已经读过this,但是该讨论仅是关于比较以基类或派生类为参数的运算符。就我而言,我想为完全不同的参数(在这种情况下为std :: string)继承虚拟运算符,而我什至找不到关于该主题的讨论。

所以对于我来说,我有以下代码:

#include <string>
#include <iostream>

class Base {
public:
    Base(std::string s) : str(s) {}
    virtual bool operator==(const std::string& s) const { return s == str; };


protected:
    std::string str;
};

class Derived : public Base {
public:
    Derived(std::string s) : Base(s) {}
    //bool operator==(const std::string& s) const override { return s == str; };
    //bool operator==(const double& d) const { return d == doub; };
protected:
    double doub;
};


int main() {
    std::string foo = "foo";
    Derived object(foo);

    if (object == foo)
        std::cout << "equal" << std::endl;
}
在这种情况下,正确导出了字符串的

运算符(正在编译代码)。但是,如果我想为double类型(取消注释第二个注释)定义另一个运算符,则代码未编译,因为编译器看不到基类中定义的字符串的运算符。取消注释第一条注释,即显式覆盖base的运算符即可。

有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:3)

让我们说你拥有

class Derived : public Base {
public:
    Derived(std::string s) : Base(s) {}
    bool operator==(const double& d) const { return d == doub; };
protected:
    double doub;
};

这里的问题是您的Derived::operator==函数隐藏 Base::operator==函数。

这可以通过使用operator==关键字将Base类中的Derived符号拉到using类中来解决:

class Derived : public Base {
public:
    Derived(std::string s) : Base(s) {}
    using Base::operator==;   // Get the symbol from the Base class into the scope of the Derived class
    bool operator==(const double& d) const { return d == doub; };
protected:
    double doub;
};