1

ウィキペディアによると複数発送とは

... 関数またはメソッドは、複数の引数の実行時 (動的) 型に基づいて動的にディスパッチできます。

ただし、C++ では、派生クラスで関数をオーバーライドできます。

#include <iostream>

using namespace std;

class Base
{
public:
    virtual void method(int a) { cout << a; }
    virtual void method(int a, int b) { cout << a + b; }
};

class Derived: public Base
{
    void method(int a) { cout << a * 10 << endl; }
    void method(int a, int b) { cout << (a + b) * 10 <<endl; }
};

int main()
{
    Base* derived = new Derived;
    derived->method(1);
    derived->method(1, 2);
    return 0;
}

ここでmethodは実行時にバインドされており (私は を使用しているためvirtual)、入力パラメーターに基づいて特定のメソッドが選択されています。

二次的な質問: このポリモーフィズムとメソッドのオーバーロードの組み合わせが C++ に存在する場合、複数のディスパッチをサポートする言語の利点 (あるとすれば) は何ですか?

4

4 に答える 4

3

いいえ。候補は、レシーバーの静的な型と引数に基づいて、コンパイラーによって静的に選択されます。次に、実行時に、レシーバーの動的タイプのみを使用して、呼び出しを最も具体的なオーバーライド メソッドにバインドします。引数の動的型は、動的バインディング フェーズでは何の役割も果たしません。

あなたの特定のケースでは、これは call のderived->method(1);場合、コンパイラがレシーバーの静的型 ( Base) と実際の引数 ( int) を調べることを意味します。Base次に、 ( で継承または宣言された)のすべてのメソッドの中から、Base最も一致するものを検索します。これはBase::method(int)。実行時に、ランタイム システムはレシーバの動的な型 ( ) を調べて、Derivedをオーバーライドする最も具体的なメソッド( ) を探し、指定された実引数 ( ) を使用してそのメソッドを呼び出します。Base::method(int)Derived::method(int)1

2 回目の呼び出しについても同様です。

于 2014-02-05T15:22:20.933 に答える
1
virtual void Base::method(int a);

として見ることができます

/*virtual*/ void method(Base&, int a);

だから、あなたの場合、あなたは持っています

derived->method(1);の間で発送します:

/*virtual*/ void method(Base&, int a);
/*virtual*/ void method(Derived&, int a);

次の期間derived->method(1, 2);に発送します:

/*virtual*/ void method(Base&, int a, int b);
/*virtual*/ void method(Derived&, int a, int b);

どちらの場合も、1 つの引数に従ってディスパッチされるだけです。

void method2(Base&, Base&);
void method2(Derived&, Base&);
void method2(Base&, Derived&);
void method2(Derived&, Derived&);

その (with のBase* derived = new Derived) method2(*derived, *derived);呼び出しvoid method2(Derived&, Derived&); が必要な場合は、複数のディスパッチが必要です。
(現在、 を呼び出しますvoid method2(Base&, Base&);)。

于 2014-02-05T15:40:08.543 に答える