Наследование и переопределение виртуального присваивания == оператор - PullRequest
0 голосов
/ 27 ноября 2018

Я прочитал это , но это обсуждение только о сравнении оператора, который принимает базовый или производный класс в качестве параметра.В моем случае я хотел бы унаследовать виртуальный оператор для совершенно другого параметра (в данном случае 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 (раскомментируя второй комментарий), код не компилируется, так как компилятор не видит оператор для строки, определенной в базовом классе.Раскомментирование первого комментария, то есть явное переопределение оператора базы, снова работает.

Может кто-нибудь объяснить такое поведение?

1 Ответ

0 голосов
/ 27 ноября 2018

Допустим, у вас есть

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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...