Как виртуальные функции работают в C# и Java?

20
задан Eric Leschinski 18 July 2013 в 14:30
поделиться

4 ответа

Все языки, поддерживающие полиморфизм, используют vtables для разрешения вызовов метода корректной функции. Так также Java и.NET.

они оба компиляция на некоторый промежуточный язык (IL для.NET и код байта для Java), но vtable не видима на этом промежуточном языке. Это поддерживается базовым механизмом (CLR для.NET)

2
ответ дан 30 November 2019 в 00:14
поделиться

Нет никакого виртуального ключевого слова в Java, по крайней мере.

Это просто решает к наиболее полученной версии любого метода, который Вы называете...

class A{
void sayhi(){ System.out.println("A");}
}
class B extends A{
void sayhi(){ System.out.println("B");}
}

A a = new B();
a.sayhi();

распечатает "B".

можно создать "чистые виртуальные" методы путем объявления класса Краткий обзор и оставления чистых виртуальных методов объявленными, но нереализованными. Или при помощи интерфейса / реализации вместо класса / расширяется. Интерфейс является в основном классом, где все методы чисты виртуальный. Это имеет добавленную премию, что класс может реализовать несколько интерфейсов, с тех пор в отличие от C++ класс Java может только наследовать еще один класс непосредственно.

РЕДАКТИРОВАНИЕ:

<час>

В ответ на Ваш комментарий, Naveen:

, Если Вы сказали = новый (); a.sayhi (); это распечатало бы "A".

терминология Java является динамичной. Можно думать о нем как виртуальном, но это может перепутать некоторый Java devs. те, кто не знает C++, по крайней мере. В Java нет никаких явных указателей, таким образом, мы не должны волноваться о виртуальном / не виртуальный. Нет никаких VTables, Вы просто отслеживаете в обратном порядке класс и его предков, пока Вы не находите реализацию метода, который Вы хотите. Существует только единичное наследование, таким образом, Вы не должны волноваться о порядке конструкторов (это является всегда восходящим).

В C++ Вы получаете другое поведение, если Вы имеете виртуальные методы и делаете что-то как [1 111]

a->sayhi();

где* указывающий на экземпляр B вместо [1 112]

a.sayhi();

где объекта типа содержание объект типа B

10
ответ дан 30 November 2019 в 00:14
поделиться

Я уверен, что Java не использует vtables, так как он может поддерживать совместимость на уровне двоичных кодов.

Для Разъяснения: vtable создается, когда derived/sub класс компилируется. Если изменения макета основы/суперкласса затем vtable для d/s должны быть перекомпилированы. В Java дело обстоит не так. Можно изменить бит/с, не имея необходимость перекомпилировать d/s.

Hmmm. Возможно, что vtable создается в разовом карликом. когда класс загружается. В этом случае Java и C++ были бы тем же то же, но отличающийся.

0
ответ дан 30 November 2019 в 00:14
поделиться

Pure virtual functions are in C++. C# uses Interfaces to serve the same purpose, so I'd suggest you go that route.

-2
ответ дан 30 November 2019 в 00:14
поделиться