C++ の vptr, vtable
http://www.kniraj.com/vtable-and-vptr-how-it-works-in-c/ の図がとてもわかりやすかったので引用.
例えば,
class Base { public: virtual void function1() {}; virtual void function2() {}; }; class D1: public Base { public: virtual void function1() {}; }; class D2: public Base { public: virtual void function2() {}; };
のとき,
Base* d1_ptr = new D1(); d1_ptr->function1(); // D1::function1() が呼ばれる d1_ptr->function2(); // Base::function2() が呼ばれる
となる.*d1_ptr とすると D1 のオブジェクトが得られ,その __vptr が参照されてこのような挙動に.
疑問
これ,D1 と D2 のメンバ関数である function1 と function2 が virtual になっているが,もし virtual ではないばあい D1 と D2 の vtable は作成されるのだろうか? virtual なクラスを継承した時点で,vptr と vtable は作成されると予想.
追記
疑問へ答えるために g++ の -fdump-class-hierarchy オプションで vtable の中身を覗いたところ「D1 と D2 内にある function1 と function2 の virtual があってもなくても同じレイアウトが生成される」ということが分かった.