vtableとは、オブジェクト指向のプログラムにおいて「仮想関数」を扱う上で重要な「モノ」です (vtableの「v」は「virtual」(仮想的な) の頭文字です)。

このvtableは、C++のプログラミングにおいてクラスのメソッドを作成する際、「virtual」キーワードをつけて宣言する(仮想メソッド/仮想関数)と自動的に「vftable」として作成されます。vftableは「関数ポインタの配列」(のポインタ)となっており、仮想メソッドの実際のアドレスがここに順番に格納されます。

[C++]

class CTest {
public:
    virtual void Test1();
    virtual int Test2(int count);
    unsigned int Test3();
};

CTest testClass;

例えばこの「testClass変数」では、変数用のメモリ上の一番初めにvftableの配列が入り、その中身は以下のようになります。

  testClass.vftable = {...}
    [0] = &CTest::Test1
    [1] = &CTest::Test2

さらに、CTestを継承したクラスで仮想メソッドを定義すると、vftableの中身も変わってきます。

[C++]

class CTest2 : public CTest {
public:
    virtual void Test1();
    unsigned long Test4();
    virtual unsigned long Test5();
};

CTest2 testClass2;
CTest* pTest = &testClass2;
  pTest->vftable = {...} [testClass2.vftable]
    [0] = &CTest2::Test1
    [1] = &CTest::Test2
    [2] = &CTest2::Test5

仮想メソッドを継承すると、vftableのそれに当たる部分のアドレスが継承したメソッドのものに置き換えられます。仮想メソッドを呼び出す際は、例えば pTest->Test1() と呼び出すとすると、直接「CTest::Test1()」が呼び出されるのではなく、vftable配列のエントリ0に格納されているアドレスのメソッドが呼び出されます。

vtable | わき道プログラミング torch
1ヶ月前に投稿されました. リアクションが0件あります.