Slip Ahead Logging

It's not your fault at all.

C++ の vptr, vtable

http://www.kniraj.com/vtable-and-vptr-how-it-works-in-c/ の図がとてもわかりやすかったので引用.

f:id:mooz:20120113173013g:plain

例えば,

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 があってもなくても同じレイアウトが生成される」ということが分かった.