3

重複の可能性:
仮想関数のデフォルトの引数の動作

class Human{ virtual void print(int height =72){ cout << "Human: " << height << endl; }};
class Child:public Human{ void print(int height =48){ cout << "Child: " << height << endl; }};

int main()
{
 Human * brother = new Child();
 brother->print();
}

結果はこれです

Child: 72

基本クラスからデフォルトパラメータを取得し、派生クラスから関数定義を取得するのはなぜですか?C++スタンダーに関連する説明を期待しています。

4

1 に答える 1

7

関数に渡されるパラメーターは、関数を呼び出すコードによって決定されます。関数の動作は、一度呼び出されると、クラス次第です。この動作が必要な場合は、パラメーターを受け取らない仮想関数を作成してください。

呼び出し元のコードがその関数のプロトタイプを必ずしも見ることができないため、派生関数のデフォルトパラメータを取得することは不可能です。

検討:

void someFunction(Human *h)
{
    h->print();
}

Humanこのコードは、デフォルト値が48の関数を持つ派生クラスが存在することを認識していない可能性がありprintます。いずれにしても、実際にその値を渡すことを知る方法はありません。

このコードがコンパイルされてからずっと後、次のようなコードにリンクされる可能性があります。

class BasketBallPlayer : public Human
{
    void print(int height = 84);
}

Human *j = new BasketBallPlayer();
someFunction(j);

8.3.6.10を参照してください。

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

于 2012-10-08T05:33:45.617 に答える