在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()
(有关C++代码,请参见http://www.parashift.com/c++-faq-lite/calling-virtuals-from-ctors.html)
是什么导致了Java和C++之间的这种差异?是vtable初始化的时间吗?
编辑:我确实理解Java和C++机制。我想知道的是这个设计决策背后的原因。