Рейтинг:
12
Greg Utas
Two
происходит от One
. Оба объявляют функцию funct1
. Декларация в Two
скрывает декларация в One
, так что он больше не доступен.
EDIT1- Я успешно скомпилировал его, так что не знаю, что вам сказать. Это плохая практика-перегружать имя функции таким образом, поэтому я не знаю, буду ли я продолжать играть с этим.
EDIT2: Видеть этот[^]. Твой using
оператор предназначен для члена класса, а не для пространства имен, и соответствующее объяснение таково
Using-declaration вводит член базового класса в определение производного класса, например, чтобы предоставить защищенный член base в качестве открытого члена производного. В этом случае спецификатор вложенного имени должен называть базовый класс определяемого класса. Если имя является именем перегруженной функции-члена базового класса, то вводятся все функции-члены базового класса с этим именем. Если производный класс уже имеет член с тем же именем, списком параметров и квалификациями, то член производного класса скрывает или переопределяет (не конфликтует) член, введенный из базового класса.
Я не знаю, как истолковать последнее предложение,
скрывает или переопределяет (не конфликтует с). Ваша функция не является надлежащим переопределением, потому что эта функция не является таковой
virtual
Таким образом, предложение, по-видимому, подразумевает, что оно скрывает, но не противоречит имени базового класса. Для меня это не имеет никакого смысла.
Southmountain
но типы аргументов разные, все должно быть в порядке..
Greg Utas
Нет, это не нормально, хотя вполне возможно, что оператор using позволяет ему успешно компилироваться (я использую VS2017). Соответствует ли это спецификации - другой вопрос. Это кажется полезным, но приведенная выше цитата предполагает, что он не может быть портативным. Более того, почему вы хотите это сделать? Просто используй другое имя.
Southmountain
большое вам спасибо за ваше время! Теперь я понимаю ваш ответ.
что вы сделали для вашего EDIT1, чтобы он был скомпилирован? Мне любопытно это знать...
Greg Utas
Я только удалил <==== "комментарий" в строке, где вы получили ошибку.
Greg Utas
Вы должны были прокомментировать "использование пространства имен One", потому что One-это класс, а не пространство имен.
Southmountain
Большое спасибо! Я тестирую эту демонстрацию, чтобы получить больше понимания концепции пространства имен. во всех других случаях использования пространства имен я хорошо играл, пока не столкнулся с этим случаем.
Greg Utas
Всегда пожалуйста!