2008-11-02 16 views
3

Я понимаю, как работает динамическое связывание, а также разница между статическим и динамическим связыванием. У меня просто возникают проблемы с переносом моего мозга вокруг определения динамической привязки. В принципе, это не тип привязки во время выполнения.Понимание динамического связывания

+0

Вы говорите об динамической привязке, а не о динамической компоновке? – 2008-11-02 23:25:03

ответ

3

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

на более высоком уровне, если у вас есть строка кода:

foo(bar) //Calls a funciton 

Если это может быть известно во время компиляции точно, какие функции это будет вызывать, это статическое связывание. Если foo может означать несколько функций в зависимости от вещей, которые невозможно узнать во время компиляции, это динамическое связывание.

1

Я понимаю, что это проявляется в полиморфизме. Обычно при создании нескольких классов, полученных из базового класса. Если каждый из производных классов содержит функцию, которую каждый использует. Базовый класс может использоваться для выполнения функции производных классов, и он будет правильно вызывать правильную функцию.

Например:

class Animal 
{ 
void talk(); 
} 

class Dog extends Animal 
{ 
public void talk() { System.out.println("woof"); } 
} 

class Cat extends Animal 
{ 
public void talk() { System.out.println("meow"); } 
} 

.... 
Animal zoo[2]; 
zoo[0] = new Dog(); 
zoo[1] = new Cat(); 

for(Animal animalToggle: zoo) 
{ 
animalToggle.talk(); 
} 

напечатает: гав мяу

Моя интерпретация, надеюсь, что это помогает.