Декларация доступа к перегруженному методу базового класса - PullRequest
6 голосов
/ 05 января 2011

Учитывая, что у нас перегружены методы в базовом классе, и производный класс, который был унаследован как закрытый / защищенный.

  1. Можем ли мы восстановить только один / несколько исходных уровней доступа перегруженных методов?
  2. На GCC 4.4.0 я пытаюсь поместить базовые методы в защищенный доступ, а затем унаследовал его, используя частный доступ.Когда я пытаюсь восстановить уровень доступа к общественности, это работает!Это как это должно работать?или это ошибка компилятора?Насколько я понимаю, восстановление уровня доступа не должно использоваться для повышения или понижения уровня доступа участника.

Фрагмент кода:

class base {
  public:
    void method() {}
    void method(int x) {}
  protected:
    void method2() {}
};

class derived : private base {
  public:
    base::method; // Here, i want to restore only the none parameterized method
    base::method2; // method2 is now public??
};

Ответы [ 3 ]

4 голосов
/ 05 января 2011

Изменение доступности унаследованных функций через объявление using не может быть выполнено выборочно при заданной перегрузке по той простой причине, что объявление using только вводит имя в декларативное регион и что по определению, перегрузки функций имеют одно и то же имя.

Единственная альтернатива, которую я вижу здесь, - использовать тривиальные функции пересылки:

class derived : private base
{
public:
    void method() { base::method(); }

    using base::method2; // method2 is now public
    // method(int) stays inaccessible
};

Я не совсем уверен, что понимаю ваш второй вопрос, но да: вы можете изменить доступность базовых членов в производном классе с помощью объявлений using.

1 голос
/ 05 января 2011

Было бы невозможно предотвратить доступ к защищенным методам, если бы производный класс хотел этого, так как вы могли бы просто написать небольшую оболочку и все готово. private это другое дело.

1 голос
/ 05 января 2011

Вы не восстанавливаете доступ как таковой. Вы установите доступ. Как вы делаете выше, вы можете явно установить доступ для любого метода, в том числе ранее объявленного как private.

...