You cannot use the protected operator == in a derived class

#include <iostream>

class Foo {
public:
    int m_foo;
    Foo(int a_foo) : m_foo(a_foo) {}

protected:
    bool operator==(const Foo& a) const {
        std::cout << "Foo: " << m_foo << " == " << a.m_foo << '\n';
        return m_foo == a.m_foo;
    }
};

class Bar : public Foo {
public:
    int m_bar;
    Bar(int a_foo, int a_bar) :
        Foo(a_foo),
        m_bar(a_bar)
    {}

    bool operator==(const Bar& a) const {
        std::cout << "Bar: " << m_foo << ", " << m_bar << " == " << a.m_foo << ", " << a.m_bar << '\n';
        return (const Foo&)*this == (const Foo&)a &&
               m_bar             == a.m_bar;
    }
};

int main() {
    Bar a(1, 1);
    Bar b(1, 2);
    Bar c(2, 2);

    std::cout << (a == a) << '\n';
    std::cout << (a == b) << '\n';
    std::cout << (a == c) << '\n';

    return 0;
}

In my real code Foo, this is a class that can be created, but should not be used operator==, and so I made it protected. I get a compiler error from this:

foo.cpp: In member function ‘bool Bar::operator==(const Bar&) const’:
foo.cpp:9:7: error: ‘bool Foo::operator==(const Foo&) const’ is protected
  bool operator==(const Foo& a) const {
       ^
foo.cpp:25:43: error: within this context
   return (const Foo&)*this == (const Foo&)a &&
                                           ^

Why is this not allowed? Should a derived class use a method protected?

+4
source share
1 answer

I can't answer why (for now), but this alternative syntax does what you want:

return Foo::operator==(a) &&  (m_bar == a.m_bar);
+3
source

Source: https://habr.com/ru/post/1675087/


All Articles