Почему я не могу получить доступ к публичной функции с защищенной перегрузкой? - PullRequest
3 голосов
/ 28 февраля 2012

Учитывая код:

class Foo
{
public:
    Foo() {}

    int foo() const { return 6; }
protected:
    int foo() { return 5; }
};

int main(int argc, char* argv[])
{
    Foo foo;
    foo.foo();
    return 0;
}

Я получаю ошибку компиляции:

'Foo :: foo': не могу получить доступ к защищенному члену, объявленному в классе 'Foo'

При фактическом использовании я пытаюсь предоставить функцию, которая возвращает указатель на объект, который хранится в классе - изменяемый для членов и const для всех остальных.Я подумал, что если я скажу

const Item *i = foo.foo();

в функции, не являющейся членом, будет вызван правильный, постоянный вариант.Но почему-то компилятор настаивает на доступе к неконстантному варианту в защищенном разделе.Есть идеи почему?Спасибо.

Ответы [ 2 ]

8 голосов
/ 28 февраля 2012

Ваша переменная неконстантна, поэтому выбрана неконстантная перегрузка функции. После разрешения перегрузки проверяется , затем доступность.

Когда существуют функции const и не-const, версия const вызывается только для объектов const. Ваша переменная foo не является константой. Вы можете сделать равным const_cast, если хотите:

const_cast<Foo const&>(foo).foo();

Хотя это неудобно в использовании. Лучшим решением было бы просто дать внутренней функции другое имя, чтобы она не конфликтовала с внешним API.

3 голосов
/ 28 февраля 2012

Для объекта, не являющегося const, перегрузка функции, отличная от const, выбирается вместо функции const, если они оба существуют.

foo имеет тип Foo, а не const Foo, поэтому компилятор выбирает версию protected, отличную от const.

Код будет скомпилирован 3 способами:

  1. Либо сделать Foo::foo() в public
  2. Или используйте const Foo, чтобы компилятор выбирал const-correct версия
  3. Удалить не const версию
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...