ホームページ  >  記事  >  バックエンド開発  >  仮想関数のデフォルトの引数が派生クラスの値ではなく基本クラスの値を使用するのはなぜですか?

仮想関数のデフォルトの引数が派生クラスの値ではなく基本クラスの値を使用するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-09 22:00:03789ブラウズ

Why Does a Virtual Function's Default Argument Use the Base Class's Value Instead of the Derived Class's?

仮想関数のデフォルト引数の動作について

C では、仮想関数を使用すると、派生クラスが基本クラスで定義された関数の実装をオーバーライドできます。ただし、仮想関数のデフォルトの引数の動作は混乱を招く可能性があります。

問題の説明:

次のコード スニペットを考えてみましょう:

class B {
public:
    B();
    virtual void print(int data=10) {
        cout << endl << "B--data=" << data;
    }
};

class D:public B {
public:
    D();
    void print(int data=20) {
        cout << endl << "D--data=" << data;
    }
};

int main() {
    B *bp = new D();
    bp->print();
    return 0;
}

期待される出力:

[ D--data=20 ]

実際の出力:

[ D--data=10 ]

説明:

C 標準 (8.3.6.10) によれば、ポインタまたは参照の場合、デフォルトの引数は、派生クラスのオーバーライド関数ではなく、ポインターまたは参照の静的型から派生します。

この場合、 bp は型 B のポインターであるため、B:: のデフォルト引数は、 print (10) が使用され、D::print のデフォルト引数 (20) がオーバーライドされます。

したがって、出力は次のようになります。予想される D--data=20 ではなく D--data=10.

以上が仮想関数のデフォルトの引数が派生クラスの値ではなく基本クラスの値を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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