Наследование и наиважнейшее виртуальное назначение == оператора

голоса
0

Я прочитал это , но это обсуждение только о сравнении оператор, переводящий базу или производного класса в качестве параметра. В моем случае , я хотел бы, чтобы наследовать виртуальный оператор для совершенно другого параметра (Std :: строки в данном случае) , и я не мог найти даже дискуссию на эту тему.

Так что в моем случае у меня есть следующий код:

#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;
}

оператор строки корректно получен (код компиляции) в этом случае. Но если я хотел бы задать еще один оператор, для типа двойного (раскомментировав второй комментария), код не компиляции, так как компилятор не видит оператор для строки, определенной в базовом классе. Раскомментировав первый комментарий, оператор т.е. явно Переопределения Base работает снова.

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

Задан 27/11/2018 в 15:08
источник пользователем
На других языках...                            


1 ответов

голоса
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;
};
Ответил 27/11/2018 в 15:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more