仮想関数にはデフォルトのパラメーターを指定できますか?
問題:
仮想関数を宣言するとき基本クラスにデフォルトパラメータがある場合、派生クラスはこれらを継承しますかデフォルト?
答え:
いいえ、仮想関数のデフォルトは派生クラスに継承されません。使用されるデフォルトは、関数が呼び出されたときのオブジェクトの静的型によって決まります。
説明:
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 サイトの他の関連記事を参照してください。