在 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++ 机制。我想知道的是这个设计决策背后的见解。