1

その背後にある理由を見つけるのを手伝ってください:

#include <iostream>
using std::cout;

class A {
  public:
     virtual void fun(int a = 5) { cout<<a; }
};
class B::public A {
  public:
     void fun(int a = 10) {
        cout<<"Inside A::B::fun().\n";
        cout<<"\n"<<a;
     }
};
int _tmain(int argc, _TCHAR* argv[]) {
  A *obj = new B();
  obj->fun();
  reutrn 0;
}

B :: fun()を呼び出していますが、まだ5を出力していますが、なぜ、どのように機能するのでしょうか。

4

2 に答える 2

1
A *obj = new B();
obj->fun();

このコードでfun()は、は多形的に呼び出されます。呼び出し元はの知識(のみ)を使用しますA::fun()が、呼び出しはの実装にリダイレクトするポインターにディスパッチされB::fun()ます。その関数の引数-- a/ 5-は、リダイレクトされた呼び出しの前に呼び出し元によって提供されます(ただし、コンパイル中は-の前に)- A'のデフォルトが表示されますが、B'は表示されません。

期待どおりの値が必要な場合は、番兵の値をチェックし、必要に応じて5または10に置き換えるA::fun(int a = -1)実装を使用して、または他の番兵の値を使用できるように機能する場合があります。funこのように、実装固有の値は、呼び出し前ではなく、呼び出し中に組み込まれます。

于 2013-02-08T06:43:10.883 に答える
0

デフォルトのパラメータは、動的ディスパッチ動作によって特徴付けられません。それらは静的です。Scott Meyersは、これについて「EffectiveC++」で詳しく説明しています。

于 2013-02-08T06:43:45.130 に答える