Динамическое связывание в C ++ - PullRequest
5 голосов
/ 10 апреля 2009

Мне нужны некоторые пояснения по динамическому связыванию в C ++. Я запутался в следующем:

  1. В C вы можете иметь массив указателей на функции и назначать различные функции одной и той же сигнатуры и вызывать их на основе индекса; такое динамическое связывание?

  2. В C ++ вы можете иметь массив указателей базового класса, но вы можете вызывать различные функции производного класса, назначая адреса объектов производного класса массиву указателей базового класса и используя виртуальные функции, Is это динамическое связывание?

  3. Какой термин правильный - Dynamic binding или Link-Time Binding?

Ответы [ 5 ]

6 голосов
/ 10 апреля 2009

Ответы

  1. Нет. Это гораздо ближе к динамической диспетчеризации, чем к динамической привязке. Динамическое связывание относится к способу, которым метод с именем связывается во время выполнения. Здесь нет имени.
  2. Да. Если методы являются виртуальными, то это определение динамического связывания. Имя известно во время компиляции, но вызываемый метод не может быть определен без знания типа объекта среды выполнения
  3. Я не уверен, что вы имеете в виду здесь. Динамическое связывание - более идиоматический термин.
2 голосов
/ 10 апреля 2009

Я бы назвал оба эти варианта использования динамического связывания. В C ++ язык предоставляет вам механизм, так что вам не нужно кататься самостоятельно, как в C.

(Однажды я работал с приложением, в котором каждый крупный объект передавался вместе с struct, чьи поля были указателями на функции. Цель структуры состояла в том, чтобы приложение могло реализовать динамическую динамическую привязка - то есть, чтобы изменить назначенные функции для объекта во время выполнения, в зависимости от состояния объекта. Насколько мне известно, эта "особенность" никогда не использовалась.)

1 голос
/ 10 апреля 2009

Вы путаете понятие динамического связывания с реализацией. Динамическое связывание, т. Е. Выбор метода для вызова на основе типа принимающего объекта, может быть реализовано с использованием некоторой формы динамической диспетчеризации, т. Е. Your (1), но мы обычно определяем имя, чтобы ссылаться только на ситуацию (2).

1 голос
/ 10 апреля 2009

Вы пытались написать код на языке Си? Какой компилятор вы использовали для этого? В языке C не может быть двух функций с одинаковым именем.

1 голос
/ 10 апреля 2009

Динамическое связывание - это привязка интерфейса к его реализации во время выполнения - любая ситуация, когда программа автоматически решает, какой код вызывать в качестве реализации интерфейса. Таким образом, вообще говоря, 1) и 2) являются динамическим связыванием, но термин обычно используется только для 2).

Связывание по времени соединения (раннее связывание) противоположно динамическому связыванию (позднее связывание). При связывании во время компиляции компилятор / компоновщик точно знает, какой код вызывать, и создает прямой вызов этого кода. При динамическом связывании компилятор / компоновщик этого не знает - точная реализация определяется во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...