参照またはポインターを使用してメソッドを呼び出す場合、コンパイラーはメソッドの宣言でポインターまたは参照の型を検索します (ここでは、B
signature を持つメソッドの宣言を検索しますf()
)。見つかった場合:
- としてマークされていない場合は
virtual
、このクラスに定義されたメソッドへの呼び出しとして解決します - これは静的バインディングです。
- としてマークされている場合
virtual
、呼び出されるメソッドは、参照またはポイントされるオブジェクトの適切なメソッドになります。これは動的バインディングです。
次のテストは次のようになります。
DD * dd = new DD();
D * d = dd;
B * b = d;
b->f();
d->f();
dd->f();
異なる方法で使用/表示される1 つのオブジェクトnew DD()
... 各タイプは、オブジェクトに対する一種のビューと考えることができます。B
それを として見ると、何かをしますが、常に同じことをしますが、またはf()
として見ると、何か違うことをします...D
DD
f()
通りで誰かに会った場合、彼があなたに挨拶する標準的な方法は、こんにちはと言うことですが、同じ人が彼の友人に会ったとき、彼は挨拶することができます! またはよ!:
class Person {
public:
void salute() { cout << "Hello" << endl; }
};
class Friend : public Person {
public:
virtual void salute() { cout << "Hi!" << endl; }
};
class RoomMate : public Friend {
public:
virtual void salute() { cout << "Yo!" << endl; }
};
void asACustomer(Person &p) {
p.salute(); // static binding, we need the standard politeness
}
void asAFriend(Friend &f) {
p.salute(); // dynamic binding, we want an appropriate message...
}
RoomMate joe;
asCustomer(joe);
asFriend(joe);
静的バインディングを使用すると、コンパイル時にどのメソッドが呼び出されるかがわかります。動的バインディングではできません。適切なバインディングがあることだけがわかります。これは、サブタイピング ポリモーフィズムの重要なポイントです。
一般に、メソッドの静的バインディングと動的バインディングを混在させる場合は注意が必要です。