Вызов виртуального метода в конструкторе: разница между Java и C ++

В Java:

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();
    }
}

Это будет выводить

Base::Base()
Derived::virt()
Derived::Derived()
Derived::virt()

Однако в C ++ результат другой:

Base::Base()
Base::virt() // ← Not Derived::virt()
Derived::Derived()
Derived::virt()

(Увидетьhttp://www.parashift.com/c++-faq-lite/calling-virtuals-from-ctors.html для кода C ++)

Что вызывает такую разницу между Java и C ++? Это время, когда vtable инициализируется?

РЕДАКТИРОВАТЬ: Я понимаю механизмы Java и C ++. Что я хочу знать, так это понимание этого дизайнерского решения.

Ответы на вопрос(7)

Ваш ответ на вопрос