Почему я не могу вызвать оператор базового класса из производного класса? - PullRequest
5 голосов
/ 11 апреля 2019

Рассмотрим этот код, который пытается вызвать оператор сравнения базового класса из оператора производного класса:

struct Base
{
    protected:
    int _a;
    bool operator == ( const Base& other ) const
    {
        return (_a == other._a);
    }
};

struct Derived : public Base
{
    bool operator == ( const Derived& other ) const
    {
        return static_cast<Base>(*this) == static_cast<Base>(other);
    }
};

int main()
{
    Derived b1, b2;
    if( b1 == b2 )
        ;
}

Сбой:

main.cpp: 25:61: ошибка: 'bool Base :: operator == (const Base &)' защищен в этом контексте return static_cast (* this) == static_cast (other);

Я не могу понять, почемуЯ не могу получить доступ к этому оператору из производного класса.

Я провел поиск, прежде чем задавать вопрос, и обнаружил этот другой вопрос , который выглядит аналогично.Однако:

  1. В другом вопросе OP хочет сравнить (производный класс) с объектом базового класса, когда мне нужно сравнение объектов того же типа.
  2. Iне понимаю данное объяснение.
  3. Случай несколько отличается: в другом вопросе принятый ответ предлагает провести сравнение базовых членов в производном классе.Что если у меня есть для сравнения в базовом классе?

По пункту 2 позвольте мне уточнить: принятый ответ от @Barry предполагает, что в качествеобъект преобразуется в базовый класс ... поэтому он не может получить доступ к членам базового класса!Это почему ?Для меня это неясно.

Может ли кто-нибудь дать четкое объяснение ситуации здесь (и, возможно, прийти с решением ...)?

Если вы чувствуете, что где-то может быть какой-то другой вопросчто проясняет ситуацию, пожалуйста, ссылку на нее (я не могу найти).

Ответы [ 2 ]

7 голосов
/ 12 апреля 2019

Вместо того, чтобы пытаться выполнить статическое приведение себя, чтобы попытаться заставить компилятор разрешить вызов оператора Base, вы можете просто явно вызвать оператор сравнения Base.

Кроме того, поскольку это не приведет к изменению объекта, вам, вероятно, следует сделать этот метод (и базовый метод) const.

В целом это будет выглядеть так:

bool operator == ( const Derived& other ) const
{
    return Base::operator==(other);
}

Посмотрите, как работает здесь: ideone

3 голосов
/ 12 апреля 2019

11.5 Защищенный доступ к элементу [class.protected]

Когда друг или функция-член производного класса ссылается на функция защищенного нестатического члена или защищенный элемент нестатического данных базового класса, проверка доступа применяется в дополнение к тем описано ранее в пункте 11.102) За исключением случаев, когда формируется указатель на член (5.3.1), доступ должен быть через указатель на, ссылку на, или объект самого производного класса (или любой класс, производный от этого класс) (5.2.5). Если доступ должен сформировать указатель на член, спецификатор nested-name должен указывать имя производного класса (или любого класса происходит от этого класса).

Подробнее здесь

...