Множественное наследование и управление доступом
От: m_smiley  
Дата: 19.06.06 20:18
Оценка:
Читаю я эту главу (15.3.2.1) в книге Страуструпа "Язык прогарммирования С++" и не могу понять...

"Если доступ к имени или базовому классу может быть осуществлен при помощи нескольких путей в решетке классов с множественным наследованием, то доступ разрешен только в том случае, если он разрешен по каждому из возможных путей. Например:

struct B
{
  int m;
  static int sm;
  //...
};

class D1: public virtual B {};
class D2: public virtual B {};
class DD: public D1, private D2 {};

DD* pd = new DD;
B* pb = pd;     //Правильно: доступ через D1
int i1 = pd->m; //Правильно: доступ через D1

"
Если доступ к имени или базовому классу (struct B) может быть осуществлен при помощи нескольких путей в решетке классов с множественным наследованием (может, через D1 и D2), то доступ разрешен только в том случае, если он разрешен по каждому из возможных путей (через D1 разрешен, а через D2 не разрешен). Так почему тогда в итоге доступ все-таки разрешен? Что-то я запутался.
Re: Множественное наследование и управление доступом
От: MuTPu4  
Дата: 19.06.06 20:55
Оценка: 2 (1)
Здравствуйте, m_smiley, Вы писали:

_>"Если доступ к имени или базовому классу может быть осуществлен при помощи нескольких путей в решетке классов с множественным наследованием, то доступ разрешен только в том случае, если он разрешен по каждому из возможных путей. Например:

(The C++ Programming Language Third Edition, 15.3.2.1):

If a name or a base class can be reached through multiple paths in a multiple inheritance lattice, it is accessible if it is accessible through any path.

Я не знаток английского и не знаю наверняка, как корректно перевести "any" в данном случае, но предположу, что это, все же, ошибка перевода, т.е. вместо "по каждому" следует читать "хотя бы по одному".
В любом случае, стандарт языка устраняет любые неоднозначности (11.2/4):

...
A member m is accessible when named in class N if
...
there exists a base class B of N that is accessible at the point of reference, and m is accessible when named in class B.
...

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.