Вызов виртуального метода в конструкторе: разница между 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 ++. Что я хочу знать, так это понимание этого дизайнерского решения.