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ą.

questionAnswers(7)

yourAnswerToTheQuestion