Я читал про «Разрешение имен» в Википедии (Разрешение имени WIKI) и это было дано в том, что C ++ использует «Разрешение статических имен». Если это правда, тогда я не мог понять, как C ++ удается обеспечить «полиморфизм» без использования динамического разрешения имен.
Может кто-нибудь ответить, пожалуйста, использует ли C ++ «Статическое разрешение имен» или «Динамическое разрешение имен». Если он статический, вы также можете объяснить, как C ++ обеспечивает полиморфизм.
Определение разрешения имен в Википедии говорит о том, как токены преобразуются в имена конструкций (функций, типов и т. Д.). Учитывая это определение, C ++ составляет 100% статический с его разрешением имени. Каждый токен, который представляет идентификатор, должен быть связан во время компиляции с конкретной сущностью.
C ++ полиморфизм эффективно обманывает. Компилятор может видеть, что статическое имя разрешается в функцию-член, определенную с помощью virtual
ключевое слово. Если компилятор видит, что вызываемый вами объект является динамическим объектом (т. Е. Указателем / ссылкой на этот тип, а не значением этого типа), компилятор выдает специальный код для вызова этой функции.
Этот специальный код не меняет название это решает до. Что это меняет, так это функция, которая в итоге вызывается. Это не динамическое именование; это динамическая функция отправка. Имя решается во время компиляции; функция разрешается во время выполнения.
C ++ использует статическое разрешение имен, потому что переименовывает каждую функцию, чтобы каждая из них имела уникальную.
Это означает, что функция int foo(int bar)
будет известен компилятору как что-то вроде _Z3fooi
, в то время как int foo(float bar)
будет известен как что-то вроде _Z3foof
,
Это то, что мы называем название искажения.