Все языки, поддерживающие полиморфизм, используют vtables для разрешения вызовов метода корректной функции. Так также Java и.NET.
они оба компиляция на некоторый промежуточный язык (IL для.NET и код байта для Java), но vtable не видима на этом промежуточном языке. Это поддерживается базовым механизмом (CLR для.NET)
Нет никакого виртуального ключевого слова в 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
Я уверен, что Java не использует vtables, так как он может поддерживать совместимость на уровне двоичных кодов.
Для Разъяснения: vtable создается, когда derived/sub класс компилируется. Если изменения макета основы/суперкласса затем vtable для d/s должны быть перекомпилированы. В Java дело обстоит не так. Можно изменить бит/с, не имея необходимость перекомпилировать d/s.
Hmmm. Возможно, что vtable создается в разовом карликом. когда класс загружается. В этом случае Java и C++ были бы тем же то же, но отличающийся.
Pure virtual functions are in C++. C# uses Interfaces to serve the same purpose, so I'd suggest you go that route.