ホームページ >バックエンド開発 >C++ >仮想関数のデフォルトパラメータは派生クラスに継承されますか?

仮想関数のデフォルトパラメータは派生クラスに継承されますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-26 14:15:11208ブラウズ

Do Default Parameters in Virtual Functions Inherit to Derived Classes?

仮想関数にはデフォルトのパラメーターを指定できますか?

問題:

仮想関数を宣言するとき基本クラスにデフォルトパラメータがある場合、派生クラスはこれらを継承しますかデフォルト?

答え:

いいえ、仮想関数のデフォルトは派生クラスに継承されません。使用されるデフォルトは、関数が呼び出されたときのオブジェクトの静的型によって決まります。

説明:

C 標準 (C 03 および C 11) では、次のように指定されています。仮想関数呼び出しでは、関数の呼び出しに使用されるポインターまたは参照の静的型によって決定される、関数定義で宣言されたデフォルトの引数が使用されます。 function.

例:

次のコードを考えてみましょう:

struct Base {
  virtual void f(int a = 7);
};
struct Der : public Base {
  void f(int a);
};

Base オブジェクトへのポインターを介して f() を呼び出す場合、デフォルトの 7 が使用されます:

Base* pb = new Base;
pb->f(); // uses the default 7

ただし、オブジェクトでは、派生クラスのデフォルトは使用されません:

Der* pd = new Der;
pd->f(); // error: no default argument for this function

実践とコンパイラの考慮事項:

C 標準が動作を規定している一方で、一部のコンパイラは実装する場合があります仮想関数のデフォルトパラメータは異なります。ただし、コンパイラ間で一貫した動作を保証するために、標準のガイドラインに従うことをお勧めします。

コードのデモ:

次のコードは、デフォルトのパラメータの動作を示しています。

struct Base { virtual string Speak(int n = 42); };
struct Der : public Base { string Speak(int n = 84); };

int main()
{
    Base b1;
    Der d1;

    Base *pb1 = &b1, *pb2 = &d1;
    Der *pd1 = &d1;
    cout << pb1->Speak() << "\n" // Base 42
         << pb2->Speak() << "\n" // Der 42
         << pd1->Speak() << "\n" // Der 84
         << endl;
}

出力:

Base 42
Der 42
Der 84

以上が仮想関数のデフォルトパラメータは派生クラスに継承されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。