В 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()
Однако в С++ результат отличается:
Base::Base()
Base::virt() // ← Not Derived::virt()
Derived::Derived()
Derived::virt()
(см. http://www.parashift.com/c++-faq-lite/calling-virtuals-from-ctors.html для кода на С++)
Что вызывает такую разницу между Java и С++? Это время, когда vtable инициализируется?
EDIT: Я понимаю механизмы Java и С++. То, что я хочу знать, - это понимание этого дизайнерского решения.