Правила обзора данных при наследовании - C++

Строка имеет метод end_with?

stringvariable.chop! if stringvariable.end_with? '*'
7
задан Svante 17 June 2009 в 08:46
поделиться

6 ответов

Первый код работает так, как предназначен для работы C ++.

Разрешение перегрузки следует очень сложному набору правил. Из Библии Страуструпа по C ++ 15.2.2 «[A] Многозначности между функциями из разных базовых классов не разрешаются на основе типов аргументов»

Он продолжает объяснять использование «использования», как вы описали.

Это было дизайнерским решением в языке.

Я склонен следовать книге Страуструпа, а не стандарту, но я уверен, что он там есть.

[Edit]

Вот он (из стандарта):

Глава 13

Когда два или более разных объявления указаны для одного имени в одной и той же области видимости, это имя называется перегружен.

И затем:

13.2 Сопоставление деклараций

1 Два объявления функции с одним и тем же именем относятся к одной и той же функции, если они находятся в одной области и имеют эквивалентные объявления параметров (13.1). Функциональный член производного класса не находится в той же области, что и функциональный член то же имя в базовом классе.

4
ответ дан 6 December 2019 в 15:29
поделиться

Это потому, что A :: f «скрыт», а не «перегружен» или «переопределен». См .:

http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9

5
ответ дан 6 December 2019 в 15:29
поделиться

Найдите разрешение перегрузки . похожий, но не идентичный вопрос .

2
ответ дан 6 December 2019 в 15:29
поделиться

В первом случае метод базового класса 'f' скрыт методом производного класса. В C ++ нет перегрузки по областям; вот почему он не называется. Стандарт C ++ объясняет все правила поиска имени члена в разделе . 10.2 Поиск имени члена [class.member.lookup] . HTH

1
ответ дан 6 December 2019 в 15:29
поделиться

В C ++ нет перегрузки по областям действия, область действия в производных классах не является исключением. (Согласно языку программирования C ++)

Для получения дополнительной информации посетите http://www.research.att.com/~bs/bs_faq2.html#overloaddehibited

1
ответ дан 6 December 2019 в 15:29
поделиться

Первая версия код действительно должен вызывать B :: f. Вы повторно определяете символ «f» в структуре «B», поэтому он скрывает исходный символ «f» из структуры «A». Это не перегрузка, как может показаться.

Каждый раз, когда компилятор встречает bf (), он ищет в структуре «B» символ «f». Он присутствует там, поэтому компилятор решает вызвать B :: f (int), преобразовывая double в int. Он не видит необходимости сканировать родительский класс в поисках более подходящей функции ...

Тем не менее, когда вы добавляете "using A :: f", это явная директива для компилятора, чтобы сканировать родительский класс на предмет символа "f ". Теперь у класса B есть две перегруженные функции: для int и для double.

Я также считаю,

1
ответ дан 6 December 2019 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: