Wywoływanie metody wirtualnej w konstruktorze: różnica między Javą a C ++
W Javie:
class Base {
public Base() { System.out.println("Base::Base()"); virt(); }
void virt() { System.out.println("Base::virt()"); }
}
class Derived extends Base {
public Derived() { System.out.println("Derived::Derived()"); virt(); }
void virt() { System.out.println("Derived::virt()"); }
}
public class Main {
public static void main(String[] args) {
new Derived();
}
}
Spowoduje to wyjście
Base::Base()
Derived::virt()
Derived::Derived()
Derived::virt()
Jednak w C ++ wynik jest inny:
Base::Base()
Base::virt() // ← Not Derived::virt()
Derived::Derived()
Derived::virt()
(Widziećhttp://www.parashift.com/c++-faq-lite/calling-virtuals-from-ctors.html dla kodu C ++)
Co powoduje taką różnicę między Javą a C ++? Czy jest to czas inicjowania vtable?
EDYTOWAĆ: Rozumiem mechanizmy Java i C ++. Chcę wiedzieć, co kryje się za tą decyzją projektową.