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

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

Barbara Streisand
リリース: 2024-11-26 14:15:11
オリジナル
165 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート