2

わかりましたので、次のコード (111222223) の出力に関する質問があります。

#include <iostream>
struct C {
 virtual int eq(const C& other) const { return 1; }
};
struct SC : C {
 virtual int eq(const C& other) const { return 2; } 
 virtual int eq(const SC& other) const { return 3; }
};
void go(const C& c, const C& c1, const SC& sc) {
 using namespace std;

 cout << c.eq(c) << endl;
 cout << c.eq(c1) << endl;
 cout << c.eq(sc) << endl;

 cout << c1.eq(c) << endl;
 cout << c1.eq(c1) << endl;
 cout << c1.eq(sc) << endl;

 cout << sc.eq(c) << endl;
 cout << sc.eq(c1) << endl;
 cout << sc.eq(sc) << endl;
}
int main(int argc, const char* argv[]) { 
 go(C(), SC(), SC());
 return 0;
}

したがって、呼び出し元の実行時の型に基づいて適切な仮想メソッドを動的にバインドする参照でドット演算子を使用していることを理解しています (-> ポインターが必要ですが、ここでは動的な心構えには問題ありません)。私が理解していないのは、最後から 2 番目の cout 行が「3」ではなく「2」を出力する理由です。これは、メソッド シグネチャが静的であり、適切な派生型 SC の静的シグネチャに基づいてメソッドが選択されるためですか? 事前に助けてくれてありがとう!

4

2 に答える 2

2

これは、関数解決規則によるものです。

この呼び出しでは:

sc.eq(c1);

c1 が動的にオーバーロードされた型struct Cである場合、1 つの関数のみを呼び出すことができます。eq

でも通話では

sc.eq(sc);

eq呼び出される可能性のある関数が 2 つあります。最初のものはstruct C動的にオーバーロードされた で宣言されeq、2 番目は で宣言されたものstruct SCです。Once scis of typestruct SCの最後の方法は、前者より実行可能です。

それがあなたが3結果として得ている理由です。

于 2013-10-17T21:26:41.983 に答える