Могу ли я сделать публичную переменную-член приватной в производном классе? - PullRequest
5 голосов
/ 02 сентября 2010

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

class A {
public:
    int   x;
    int   y;
};

class B : public A {
    // x is still public
private:
    // y is now private
    using y;
};

Но, очевидно, «использование» не может быть использовано таким образом.Есть ли способ сделать это в C ++?

(я не могу использовать частное наследование, потому что есть другие члены и функции A, которые все еще должны быть открытыми.)

Ответы [ 2 ]

3 голосов
/ 02 сентября 2010

Да, использование декларации technically позволяет вам сделать это.

Вы должны использовать using A::y вместо using y

Однако, пожалуйста, серьезно оцените, если это делает дизайнсмысл.

Несколько замечаний:

  1. У вашего класса не должно быть общедоступных данных.Этого следует избегать, насколько это возможно.Если вы придерживаетесь этого принципа разработки, вам может не понадобиться делать его закрытым в производном классе.

  2. Придерживайтесь LSP .Если у базового класса есть открытый метод, и если вы не делаете частное наследование, клиенты будут сбиты с толку, если производный класс сделает метод базового класса частным с такими объявлениями с использованием.

3 голосов
/ 02 сентября 2010

Краткий ответ: нет. Подстановка Лискова и характер публичного наследования требуют, чтобы все, что вы можете сделать с A (то есть с его публичными членами), также могло быть сделано с помощью B. Это означает, что вы не можете скрыть публичный метод.

Если вы пытаетесь скрыть публику fields, вы ничего не можете сделать. Чтобы «спрятать» публичные методы, вы можете сделать что-то вроде:

class B {
    // x is still public
    int x() { return a.x(); }
private:
    A a;
    // y is now private since you didn't add a forwarding method for it
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...