0

以下のmainの出力に対する答えは「i=10で派生クラス表示」なのですが、なぜだか分かりません。確かに関数は基本型で呼び出されましたか?

ここで答えを決定するための思考プロセスは何ですか?

class base
{
  public:
         virtual void display(int i = 10)
         {
           cout<<"Base class display with i = "<<i<<endl;
         }

};

class derived : public base
{
  public:
          void display(int i = 20)
         {
           cout<<"Derived class display with i = "<< i <<endl;
         }

};

int main(int argc, char *argv[])
{
     base *bptr = new derived;
     bptr->display();

      return 0;
}
4

1 に答える 1

2

Can virtual functions have default parameters? をご覧ください。:

仮想関数呼び出し (10.3) は、オブジェクトを示すポインターまたは参照の静的型によって決定される仮想関数の宣言で、既定の引数を使用します。派生クラスのオーバーライド関数は、オーバーライドする関数から既定の引数を取得しません。

したがって、bptr->display();の派生バージョンを呼び出しますが、ポインターの静的型であるdisplayからの引数を使用します。basebptr

これは、引数のデフォルト値はコンパイル時に決定する必要があり、動的バインディングは実行時まで延期されるためです。同じ仮想の基本バージョンと派生バージョンで異なるデフォルト引数を使用すると、ほぼ確実に問題が発生します。仮想がベースへの参照またはポインターを介して呼び出されたときに問題が発生する可能性がありますが、実行されるバージョンは派生によって定義されたものです。このような場合、仮想の基本バージョンに定義されたデフォルト引数は、別のデフォルト引数を使用して定義された派生バージョンに渡されます。

于 2013-08-05T20:13:49.713 に答える