Непейвода Н.Н. Программирование. Раздел 3

Непейвода Н.Н. Программирование. Страница 317

Например, если в языке C/C++ заданы три процедуры Role(), Role(Actor), Role(Employee), где Actorи Employee — различные типы данных, то одно­значно понятно, какая из них вызывается в следующих трех случаях (solist — переменная типа Actor, clerk — типа Employee): Role(); Role(solist); Role(clerk);

Но вот если описаны две процедуры:

то вызов Convert(15) выглядит двусмысленным, поскольку сначала 15 нужно привести к одному из возможных типов аргументов. Конечно, эта двусмыс­ленность разрешается случайными соглашениями конкретного языка, но Вы уже много раз видели, что к этим соглашениям, со стратегической точки зрения, никогда нельзя привыкать. Так что лучше подобными двусмыслен­ностями не пользоваться.

Имеется вариант, который признается некорректным практически во всех современных языках с синтаксическим полиморфизмом: процедуры описы­ваются с одним и тем же числом и одними и теми же типами аргументов, но типы значений у них разные. Конечно же, в контексте явного приведения типов, например

и такой полиморфизм синтаксически разрешим, но в прочих контекстах при полной неупорядоченности системы приведений типов он приводит к постоянным конфликтам.

Позднее связывание отнюдь не обязательно требует глубокого семантиче­ского анализа. Оно в рудиментарном виде было реализовано даже на уровне системы команд процессоров Burroughsи Эльбрус, реализующих теговую архитектуру. Конкретная реализация арифметической операции выбиралась в зависимости от тегов аргументов.

Динамическую подстановку методов в объектноориентированном про­граммировании можно трактовать как некоторый вариант позднего связыва­ния, о чем сказано в соответствующей главе.

Инициализированные параметры языкаС++. Очень соблазнительно при описании процедуры задать некоторым формальным параметрам соот­ветствующие им фактические параметры, которые будут использованы при вызовах в случаях, когда позиция соответствующего фактического парамет­ра не заполнена. Часто (как, например, в Ada, в командных языках, в языке Т^Х) это оформляется через ключевую форму параметризации. В С++ та­кая возможность реализуется в рамках позиционной формы передачи пара­метров с учетом их порядка: опускаться могут лишь последние параметры вызова. Задается инициализация параметров с помощью конструкции ини­циализатора, которая является обычной для задания начальных значений любых переменных. Это связано с тем, что параметризация данного языка подчиняется механизму передачи параметров по значению, а значит, опи­сание формальных параметров ничем не отличается от обычного описания локальных переменных.

Новости

  • 1
  • 2
Prev Next

Ракета "Ангара-А5В" в ближайшее десятилетие не полетит

24.01.2016

Ракета "Ангара-А5В" в ближайшее десятилетие не полетит

Роскосмос не планирует в течение ближайшего десятилетия осуществлять пуск тяжёлой ракеты-носителя А...

Ученые РФ опровергли выводы исследований о вреде ГМО

24.01.2016

Ученые РФ опровергли выводы исследований о вреде ГМО

Исследователи из Института проблем передачи информации (ИППИ РАН) проанализировали несколько самых п...

Летающие "Крокодилы"

24.01.2016

Летающие "Крокодилы"

20 удивительных фактов о боевом вертолете Ми-24.Этот вертолет стал таким же узнаваемым символом сове...

В Аргентине описали новый вид динозавра-гиганта

24.01.2016

О ранее неизвестном виде динозавра, относящемуся к инфраотряду зауроподов, рассказали аргентинские п...

Реклама