2014-12-10 1 views
2

Я часто слышу о том, что компиляторы не могут определить точную реализацию метода для использования при определенных условиях. Например, мы можем представить сценарий (так говорят люди), где для родительского класса с методом foo(), который был переопределен в дочернем классе, компилятор не будет теперь выполнять какую-либо реализацию foo() для вызова до выполнения. Следовательно, у нас есть понятия динамической отправки, vtables и т. Д.Почему компиляторы не могут определить истинный тип переменной до времени выполнения?

Мой вопрос: точно Почему может ли компилятор не определить точную реализацию для вызова? Я остановился, чтобы задуматься об этом в последнее время, и я изо всех сил пытался оправдать это. Возможно, есть что-то действительно очевидное, что мне не хватает (я, вероятно, буду пинать, когда услышу ответ). Это просто до внешних обстоятельств? Если да, то как это получится?

Является ли это зависящим от языка ограничением или существует нечто более фундаментальное?

+1

Тип выражения всегда известный во время компиляции. У вас есть код, который иллюстрирует то, о чем вы не уверены? –

+3

Ну, вся концепция поддержки динамического полиморфизма ** сделана **, чтобы включить обнаружение/инъекцию типа во время выполнения. –

+0

Отредактировано первое предложение. Возможно, теперь это понятно? И да, я думаю, я видел это с C++. Это статически типизированная функция? – Boon

ответ

11

Подумайте об этом:

class Base 
{ 
public: 
    virtual void some_virtual_method(){...} 
}; 
class Derived: public Base 
{ 
public:  
    void some_virtual_method() override{...} 
}; 

int choice; 
cin >> choice; // cannot know the value at compile time 

Base* foo; 

if(choice) 
{ 
    foo = new Base; 
} 
else 
{ 
    foo = new Derived; 
} 

foo->some_virtual_method(); 

Там нет никакого способа для компилятора знать, какие some_virtual_method() ссылаться во время компиляции, так как выбор зависит исключительно от пользовательского ввода. Отправка выполняется через виртуальную таблицу функций, и она выполняется во время выполнения.

+0

Как я и думал. Полагаю, я слишком много думал об этом. благодаря – Boon

0

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

Когда объект создается динамически и имеет полиморфные свойства, а функция получает параметр суперкласса типа, тип не известен под ПРОГРАММУ, пока не будет принят в.

 Смежные вопросы

  • Нет связанных вопросов^_^