Предварительные замечания
Ваш фрагмент кода не компилировать по другой причине: Base
не имеет доступа к Time
«s foo()
как это частный член. Таким образом, foo1()
вызывает ошибку, прежде чем у вас возникнет двусмысленность.
Если изменить Time
сделать защищенный его членом, то вы можете воспроизвести вашу ошибку точно так, как вы описали:
class Time{
protected:
void foo();
};
Что здесь не так?
Base
частным образом наследует Time
, так что его члены не должны быть видимыми для внешнего мира.
Но что может быть справедливо для внешнего мира, неверно для производных классов. Правила поиска имен в случае вывода говорят, что сначала имя ищется в иерархии классов, то перегрузка применяется, чем только контроль доступа осуществляется:
10.2/1 Member name lookup determines the meaning of a name (id-expression) in a class scope. Name lookup can result in an ambiguity, in which case the program is ill-formed. For an id-expression, name lookup begins in the class scope of this; for a qualified-id, name lookup begins in the scope of the nested-name-specifier. Name lookup takes place before access control.
10.2/8 If the name of an overloaded function is unambiguously found, overloading resolution also takes place before access control. Ambiguities can often be resolved by qualifying a name with its class name.
Как использовать множественное наследование:
Time
:
:
Base Time
\ :
\ :
Child
Таким образом, вы наследуете дважды foo()
, один раз через личное наследование и onve через public. Эта неоднозначность делает имя foo
в foo2()
неоднозначным в соответствии со стандартом и до того, как будет проверен доступ, что сделает ваш код недействительным.
Обратите внимание, что Child видит 2 foo(), но по иронии судьбы не может использовать ни один из них: оба передаются через частный унаследованный. Поэтому, даже если вы разрешите двусмысленность, вы получите еще одно сообщение об ошибке.
частный не скрывает. – Jarod42
Потому что как 'Base', так и' Time' имеют функцию-член с именем 'foo', и компилятор не знает, какой из них вы пытаетесь вызвать. Там что-то обманывает. –
будет ли пространство имен внутри базы скрывать? –