私はたくさんの投稿を読んでいますが、その仮想テーブルはオブジェクトごとではなく、オブジェクトごとではなく、共有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;
を行うときに実行されるどのような操作?誰かがこれらのアクションの疑似コードを書くことができますか?
vtableはC++標準では定義されていません。これは、コンパイラの作成者が自由に自由に実行できることを意味します。 vtableがまったく存在しないという保証はありません。これがC++ ABIを持っていない主な理由の1つです。それを "誰も"誰に "言う"かを伝えてください。 – Drop
おそらく 'Der1'と' Der2'はそれぞれ独自のvtableを持っていますか? –
[Johannes Schaub-litb](http://stackoverflow.com/users/34509/johannes-schaub-litb)の[answer](http://stackoverflow.com/a/562240/2352671) – 101010