1

純粋な C での仮想関数の実装に興味があります。実装の例を次に示します。次に、基本クラスの仮想関数テーブルへのポインターを介して派生クラスを実装します。派生クラスに vtable ポインターがなく、代わりに基本クラスの vtable が使用される理由。多分それらは同じオフセットだからですか?

void myClassDerived_ctor(struct myClassDerived *this)
{
    myClassBase_ctor(&this->base);
    this->base.vtable = (void*)&myClassDerived_vtable + sizeof(void*); // used vtable of the base class
}
4

3 に答える 3

5

基本クラスの vtable を使用する必要があります。全体的なポイントは、基本クラスのように見えますが、vtableに異なるエントリがあることです。したがって、それはポリモーフィックに異なる動作です。

于 2013-10-25T11:53:48.463 に答える
2

独自の vtableあります。基本クラスの vtableポインターを使用してそれを指すため、基本クラスのみを認識しているコードは、派生クラスでオーバーライドされる仮想関数を正しく呼び出すことができます。

于 2013-10-25T12:54:54.757 に答える
0

これは、ポリモーフィズムを正しく機能させるために行われます。同じオブジェクトは、基本クラスのポインターまたは派生クラスのポインターのいずれかによって指すことができます。仮想関数を呼び出す場合、どちらの場合も同じ関数 (派生クラスの関数) を呼び出す必要があります。そのため、派生クラスは、基本クラスの vtable ポインターが独自の vtable を指すようにします。これにより、すべての場合において、オブジェクトは正しい vtable を使用します。

于 2013-10-25T13:55:13.280 に答える