понедельник, 15 августа 2011 г.

Виртуальные функции в Jаva и С++.

То есть конечно же в Java нет никаких виртуальных функций. Все функции (или если следовать ООП терминологии методы) в Java имеют позднее связывание если вы явно не укажите их как final или private. Это значит что вы просто переопределяете их производных классах и получаете тот же эффект который дают виртуальные функции C++. Тот же да не тот. Я пока знаю по крайней один случай при котором виртуальные функции С++ и обычные методы Java дают разный эффект. Это если вы будете вызывать функцию которая переопределена в производном классе в конструкторе или деструкторе базового класса. То есть конечно же делать этого не в коем случае не стоит, в обоих случаях Вас ждут неприятные сюрпризы. Так что же будет происходить? В Java тип объекта во время выполнения известен и будет вызываться метод производного класса при том что инициализация объекта производного класса еще не произведена. При обращении к полям-примитивам они будут иметь значения по умолчанию, а ссылки - null. Вобщем либо неправильное поведение, либо исключение. В С++ виртуальные функции работают как известно даже при отсутствии точной информации о  типе, потому что адреса виртуальных функций находятся  в специальной таблице указатель  на которую хранит в себе объект. При работе конструктора базового класса указатель таблицы виртуальных функций имеет значение свойственное базовому классу и виртуальная функция будет вести себя как будто она виртуальной не является.

Комментариев нет:

Отправить комментарий