2015-12-15 7 views
1

Я читал о «Разрешение имен» в википедии (Name resolution WIKI), и было дано в том, что C++ использует «Разрешение статического имени». Если это правда, я не мог понять, как C++ удается обеспечить «полиморфизм» без использования динамического разрешения имен.Использует ли C++ статическое разрешение имен или разрешение динамического имени?

Может ли кто-нибудь ответить на вопрос, использует ли C++ «Разрешение статического имени» или «Разрешение динамического имени». Если это статично, можете ли вы также объяснить, как C++ обеспечивает полиморфизм.

+1

Все, что говорит о динамическом полиморфизме в C++, связано с ключевым словом «virtual». Узнайте больше об этом. –

+0

Он использует оба. Когда вы используете абстрактный класс, используйте динамический. Для других вещей, таких как шаблоны, перегрузка и т. Д., Он использует статические. –

+2

@ EdwinRodríguez Я не думаю, что * разрешение имен * является динамическим, когда вы используете абстрактный класс. Имена разрешаются во время компиляции. – juanchopanza

ответ

7

Определение разрешения имен Wikipedia заключается в том, как маркеры разрешены в имена конструкций (функции, типы имен и т. Д.). Учитывая это определение, C++ составляет 100% статический с его разрешением имен. Каждый токен, представляющий идентификатор, должен быть связан во время компиляции с определенным объектом.

Полиморфизм C++ эффективно обманывает. Компилятор может видеть, что статическое имя разрешает функцию-член, определенную с помощью ключевого слова virtual. Если компилятор видит, что объект, который вы вызываете это, является динамическим объектом (т. Е. Указателем/ссылкой на этот тип, а не значением этого типа), компилятор испускает специальный код для вызова этой функции.

Этот специальный код не изменяет имя он разрешает. Что это изменяет, это функция, которая в конечном итоге вызвана. Это не динамическое именование; то есть динамическая функция отправка. Имя определяется во время компиляции; функция будет решена во время выполнения.

0

C++ использует статическое разрешение имен, поскольку оно переименовывает каждую функцию, чтобы каждый из них имел уникальный.
Это означает, что функция int foo(int bar) будет известна компилятору как-то вроде _Z3fooi, а int foo(float bar) будет известна как-то вроде _Z3foof.
Это то, что мы называем name mangling.

+0

Эдвин Родригес сказал в комментариях, что абстрактный класс использует динамическое разрешение имен, можете ли вы это прояснить? – pasha

+0

@pasha: он путал динамическое разрешение имен и динамическую отправку. Они не связаны. –

+2

Кроме того, я уверен, что имя mangling не имеет отношения к статическому или динамическому разрешению имен. –