Читаю я эту главу (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 не разрешен).
Так почему тогда в итоге доступ все-таки разрешен? Что-то я запутался.
Здравствуйте, 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.
...