1

Следующий код:C++ множественное наследование закрытый член ambigious доступа

class A1 { 
public: 
    int x; 
}; 
class A2 { 
private: 
    int x() { return 67; } 
}; 

class M : public A1, public A2 {}; 

int main() { 
    M m; 
    m.x; 
} 

компилирует с ошибкой:

error C2385: ambiguous access of 'x' 
note: could be the 'x' in base 'A1' 
note: or could be the 'x' in base 'A2' 

Но почему? только A1::x должен быть виден М. A2::x должен быть чисто местным.

+1

В C++, * имя-поиск * происходит до * доступ к члену проверки * выполняется. – WhiZTiM

+0

Ваш вопрос задавался ранее: http://stackoverflow.com/questions/6397938/ambiguous-access –

ответ

3

В C++, name-lookup происходит до member access checking. Следовательно, имя-поиск (неквалифицированный в вашем случае) находит два имени, и это неоднозначно.

Вы можете использовать уточненное имя неоднозначность:

int main() { 
    M m; 
    m.A1::x;  //qualifed name-lookup 
} 
+0

@ tower120, no. Это не связано с ADL. [Koenig Lookup] (http://en.cppreference.com/w/cpp/language/adl) вступает в игру при выполнении неквалифицированных запросов для функций, не являющихся членами. – WhiZTiM

+0

Кстати, это что-то историческое, или это дизайн (для чего-то)? Для меня сначала это выглядело как ошибка компилятора, но теперь это выглядит как ошибка языка :) – tower120

+1

Нет, это не ошибка языка. Проблема в ожидании контроля доступа влияет на поиск имени. Если контроль доступа повлиял на поиск имени (например, изменил, какое совпадение было приемлемым), было бы легко (преднамеренно или, что еще хуже, случайно) значительно изменить поведение рабочего кода неожиданными способами, просто изменив 'private' на' public' или наоборот. Лучше предупредить программиста о двусмысленности (как это случилось с вами), чем иметь код, который является хрупким перед лицом небольших изменений. – Peter

Смежные вопросы