Зачем нужна динамическая привязка? - PullRequest
0 голосов
/ 19 октября 2019

Я не могу понять, зачем нам динамическое связывание (позднее связывание). Допустим, у нас есть класс A и класс B, и давайте скажем, что класс B расширяет класс A, теперь мы можем писать такие вещи, как «A var = new B ();»Теперь предположим, что оба класса содержат метод с одинаковой сигнатурой, например, метод "cry ()", теперь я могу написать что-то вроде "var.cry ()", теперь основанный исключительно на типе компилятора "var" не может связать праваМетод для экземпляра "var" во время компиляции, но компилятор должен проверить, допустимо ли следующее утверждение: "A var = new B ();"теперь, поскольку он должен проверить, является ли это утверждение допустимым, он должен знать, что «var» будет ссылаться на экземпляр класса B, теперь, если он это знает, компилятор должен иметь возможность связывать правильный метод во время компиляции?

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Просто предположим, что у вас есть

void foo(A someA) {
  someA.cry()

}

Что теперь? Никто не может сказать вам заранее, является ли этот входящий A A или B!

Другими словами, существует множество способов, чтобы не достоверно знал точную природу какого-либо объекта во время компиляции!

1 голос
/ 19 октября 2019

Это невозможно в общем случае. Например, здесь:

A var;

if(x) {
    var = new A();
} else {
    var = new B();
}

var.cry();

в последней строке неизвестно, если var ссылается на экземпляр A или B.

...