3

値渡しオブジェクトの構築と仮想メソッドについて質問があります。

次のような仮想メソッドがあります。

typedef boost::function1<void, void*> Task

class ITaskPool
{
    //......

    virtual AddTask(Task task) = 0;
};

そして、次のような実装

class TaskPool : public ITaskPool
{
    //......

    AddTask(Task task);
};

このように使用すると;

void MyFunc(void* arg)
{

}

int main()
{
    TaskPool tp;
    tp.AddTask(&MyFunc); 
}

Task オブジェクトは、仮想メソッドに渡されるときと派生クラスのメソッドに渡されるときに 2 回作成されますか?

ありがとう

4

4 に答える 4

3

コピーが 1 つだけ作成されます。関数 virtual を宣言すると、その派生クラスのメソッドが動的バインディングを通じて呼び出されます。最初にメソッド A が呼び出され、次にメソッド B が呼び出されるわけではありません。どのメソッドを呼び出すかは、コンパイラによって実行時に決定されます。

ポリモーフィズムと動的バインディング

于 2012-09-03T11:44:59.327 に答える
2

あなたのコードは間違っています (戻り値の型がありません) が、いいえ、1 つのコピーだけが関係しています。ポリモーフィズムについて間違った考えを持っていると思います。基本クラスのメソッドが最初に呼び出され、その後派生クラスに転送されるわけではありません。TaskPool::AddTask動的ディスパッチを通じて直接呼び出されます (ポリモーフィックに呼び出された場合)。

于 2012-09-03T11:44:08.040 に答える
0

ここにあるメソッドは 1 つだけですvirtual。基本クラスで宣言したメソッドです。派生クラスで提供するのは、メソッドの実装です。したがって、1 つのメソッドのみが呼び出されます。仮想メソッドであるため、その実装は通常実行時に選択されますが、呼び出されるのは 1 つだけです。

于 2012-09-03T11:46:04.840 に答える
0

コピーは 1 つだけ作成されます...

于 2012-09-03T11:47:21.757 に答える