2016-04-10 14 views
2

私はたくさんの投稿を読んでいますが、その仮想テーブルはオブジェクトごとではなく、オブジェクトごとではなく、共有vtableへの_vtprポインタしかありません。しかし、この例を考えてみてください:多態性の仮想テーブル

class Base 
{ 
public: 
    virtual void func1(void) {} 
    virtual void func2(void) {} 
private: 
    int dummy; 
}; 

class Der1 : public Base 
{ 
public: 
    virtual void func1(void) {} 
private: 
    int dummy; 
}; 

class Der2 : public Base 
{ 
public: 
    virtual void func2(void) {} 
private: 
    int dummy; 
}; 

int main(void) 
{ 
    Base * obj1 = new Der1; 
    Base * obj2 = new Der2; 
} 

obj1とobj2は1つのユニークな基本クラスvtableに関係していますか?答えはノーだと思いますが、説明してください。これらのオブジェクトの両方が同じvtableに関連する場合、呼び出すメソッドはどのように決定されますか?たとえば、obj1-> func1参照はobj2-> func1とは異なります。

UPDATE:
Base * obj1 = new Der1;を行うときに実行されるどのような操作?誰かがこれらのアクションの疑似コードを書くことができますか?

+2

vtableはC++標準では定義されていません。これは、コンパイラの作成者が自由に自由に実行できることを意味します。 vtableがまったく存在しないという保証はありません。これがC++ ABIを持っていない主な理由の1つです。それを "誰も"誰に "言う"かを伝えてください。 – Drop

+0

おそらく 'Der1'と' Der2'はそれぞれ独自のvtableを持っていますか? –

+1

[Johannes Schaub-litb](http://stackoverflow.com/users/34509/johannes-schaub-litb)の[answer](http://stackoverflow.com/a/562240/2352671) – 101010

答えて

1

次の図が役立ちますようお願いいたします。派生クラスは基本クラスの仮想テーブルをコピーするだけですが、適切なエントリを変更することができます。赤い部分は、指定されたクラスがv-tableのエントリを変更したことを示しています。したがって、派生クラスのインスタンスが作成されると、そのクラスに固有の変更されたテーブルが考慮されます。

基本クラスの複製がどのように処理されるか(基本クラスには多数の関数があり、派生して仮想関数テーブル全体がコピーされ、エントリが変更されます)。 IMOでは、コンパイラは、派生クラスごとにテーブル全体を単純にコピーして、単純なものにします。コールするための適切なメソッドの検索は簡単になります。 enter image description here

+0

新しいvtableの場所と場所はどこですか?もし私が間違っていれば私を訂正してください:コンパイル時Der1とDer2のvtablesはRWデータセクションに作成されます。 Base * obj1 = new Der1を割り当てるとき。 obj1-> func1()を呼び出すと、その特定のメソッドのエントリを見つけるためにDer1 vtableが参照解除されます。また、Base * obj1とobj2はポインタだけであるため、vtableを持たずコピーしません。 –

+0

これについて私の理解を承認できますか、それとも私は間違っていますか? –

+0

私はデータセクションと、コンパイラ/リンカがvテーブルをどのように正確に置くかについてはわかりません。概念的には、vテーブルをグローバルリンクリストとして考えることができます。与えられたクラスはv-tableの頭部の1つを保持します(したがって、クラスのサイズは 'sizeof(pointer) 'によって追加されます)。派生クラスは別のvテーブルのリンクリストを作成し、クラス(インスタンスではない)はリンクリストを指します。派生クラスが仮想関数を再定義しない場合は、既存のv-tableリンクリストを指します。仮想クラス階層は、そのようなリンクされたリストヘッドを複数指すことがあり、したがってサイズが増加する。本/ onlinを読んでください – Ajay