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++ のメカニズムは理解しています。私が知りたいのは、この設計上の決定の背後にある洞察です。