Здравствуйте, Evgeny.Panasyuk, Вы писали:
_>>>Ты же наверняка знаешь, что во всех этих языках все методы являются виртуальными функциями (говоря языком C++).
N>>Вы тут ну очень много написали, но в следующих ста сообщениях я не увидел возражений, поэтому комментирую. Как это получилось, что ты не в курсе, что в Java и C# просто перевёрнуто умолчание объявления метода виртуальным? Там, где в C++ говорится virtual, в Java молчат, а где в C++ не говорится virtual, в Java говорится final (а в C# — sealed), последствия для виртуальности те же.
EP>Вообще-то это другое, с другими свойствами. final/sealed не делает метод не виртуальным, точнее виртуальный метод вполне может быть final
EP>И кстати final есть и в C++, что я уже выше упоминал.
Формально и в C++ ничто не мешает сделать все методы виртуальными, насколько я помню. Но не делают
Я про то, что если метод не существовал у предков и сразу был объявлен final, то этого достаточно, чтобы его не виртуализовать, и главное, что это общеизвестно и активно используется. И если собеседник этого не знает, но говорит, что "все методы являются виртуальными функциями", то он просто не готов для дискуссии.
А формальности оставьте для language lawyers.
N>>Это чуть упрощая (есть проблемы одноимённых методов и т.п.), но для данных целей сгодится. И видя final — компилятор (пусть JIT) точно так же имеет право рисовать обращение напрямую к нужному методу или инлайнить его.
EP>Вот только в примереАвтор: pilgrim_
Дата: 14.01.17
который разбирался в топике, final в базе A на метод f не поставишь
Не поставишь. Но компилятор уже знает, что тип зависит от , и вполне может внутри себя сделать (псевдокод)
A a;
if (x) { a = new B(); a.B::f(); }
else { a = new C(); a.C::f(); }
и, по тому, что я слышал, так часто и делает.
И разбирался не только этот пример.