C ++: скрытие членов в подклассах.Имеет ли это смысл? - PullRequest
1 голос
/ 04 ноября 2010

Я только что натолкнулся на директиву using в контексте, который является новым для меня - например, «перемещение» члена родительского класса из открытого в закрытое. Я протестировал приведенный ниже пример и возникло два вопроса:

  1. Является ли код в (1) переносимым? В соответствии со стандартом, он должен быть устаревшим.
  2. Имеет ли смысл вообще скрывать открытых членов в подклассах? (Я думаю, что в Java доступ может быть сделан только менее строгим в подклассах.)

Ошибка формата кода

class A{
public:
  A():_i(1975){}
  int _i;
};

class B : public A
{
public:
  B():_i(333){}
  int i()const{ return _i;}
private:
  int _i; // (1)depricated? no warning in VS2008?
};

class C : public A
{
public:
  C(){} //_i initialized by A
  int i()const{ return _i+1;}
private:
  using A::_i; //(2) should be the right way
};

int main()
{
  B b;
  int i= b.i(); //value of B::_i (333)
  int a_i = static_cast<A*>(&b)->_i; //value of A::_i (1975)

  C c;
  int ca_i = c.i(); //value of A::_i via getter (1975+1)
  //however, A::_i is still accessible  
  a_i = static_cast<A*>(&c)->_i; //value of A::_i (1975)

  return 0;
}

Ответы [ 3 ]

1 голос
/ 04 ноября 2010

Каким бы уродливым этот код не был для меня ... (просто эстетическое чувство личности в порядке).

Это не скрытый член . Это добавленный член . В этом коде есть два i. A::_i и B::_i.

После этого можно играть. Но мне очень не нравится, когда код вводит в заблуждение таким образом.

1 голос
/ 04 ноября 2010

Для вашего удовольствия обсуждение GotW о сокрытии C ++: -)

1 голос
/ 04 ноября 2010

объявление (1): я не вижу причин, по которым это следует считать устаревшим.Я думаю, что это совершенно законно C ++.(Класс B добавляет вторую копию _i, которая затеняет _i в A, но вы все равно можете получить к ней доступ с помощью b.A::_i.)

ad (2)мне не кажется полезным, так как вы все равно можете получить доступ к _i в c, используя c.A::_i, поэтому он вообще не скрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...