Zostało to omówione w "Efektywnym C++" Scotta Meyera. Powodem, dla którego jest to niejednoznaczne, jest to, że chcieli zapewnić, że jedynie zmiana widoczności członka nie zmieni znaczenia już istniejącego kodu w innym miejscu.
W przeciwnym razie załóżmy, że twoja klasa C była gdzieś w nagłówku. Jeśli masz prywatnego członka C (int), kod, który podasz, wywoła C (float). Jeśli, z jakiegoś powodu, członek C (int) został upubliczniony, stary kod nagle wywołałby tego członka, nawet jeśli ani stary kod , ani funkcja, którą wywołał, nie zmieniły się.
EDIT: Więcej powodów:
Co gorsza, załóżmy, że miał 2 następujących funkcji:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
Te dwie funkcje by nazwać różne funkcje w zależności od tego, czy zarówno foo lub bar został uznany jako znajomego C, lub czy dziedziczy z niego A lub B. Posiadanie identycznego kodu wywoływania różnych funkcji jest przerażające.
(To chyba nie tak dobrze jak umieścić dyskusji Scott Meyera, ale taka jest idea.)
Hmm, to wydawało się wielką wyjaśnienia najpierw. Ale ... nadal możliwe jest stworzenie klasy bez intruza, a potem później, że tak stary kod nagle zaczyna wywoływać nowego członka ... Tak więc ta ochrona tworzy jedynie fałszywe poczucie bezpieczeństwa. –
Dobra uwaga. Dodam więcej. –