0

したがって、次のような基本クラスへのポインタを渡すC++関数があります。

void DoStuffAndAssignPtr(MyBase* ptr)
{
    MyBase* p;
    //do stuff
    if (stuff was awesome) p = new MyAwesome();
    else p = new MyBase();
          //vftable of p before the return is MyAwesome
    (*ptr) = (*p);
}

次に、「MyAwesome」と「MyBase」が異なる方法で実装する仮想メソッドを呼び出す必要があります。ただし、戻り値を確認する場合は、次のようになります。

void mainly()
{
    MyBase* passMe = new MyBase();
    DoStuffAndAssignPtr(passMe);
    //now passMe is always being returned with MyBase's vftable
}

'passMe'は常に'MyBase'であることがわかります(VSでのデバッグ中にvftableが表示される限り)。なぜこれが起こっているのか、そして「passMe」が仮想メソッドの「MyAwesome」実装を確実に呼び出すようにする方法について、誰かがガイダンスを提供できますか?

4

2 に答える 2