仮想関数呼び出しが派生クラスではなく基本クラスからデフォルトの引数を継承するのはなぜですか?

Patricia Arquette
リリース: 2024-11-09 10:41:02
オリジナル
395 人が閲覧しました

Why Does a Virtual Function Call Inherit the Default Argument from the Base Class Instead of the Derived Class?

仮想関数のデフォルト引数の動作: 予期せぬ難題

このコード スニペットでは、仮想関数のデフォルト引数の動作に関してジレンマが発生します。

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 で、仮想関数呼び出しのデフォルト引数は次のように規定されています。オブジェクトを表すポインタまたは参照の静的型によって決定されます。この例では、print 関数がタイプ B (bp) のポインターを介して呼び出されるため、B::print のデフォルト引数が利用され、予期しない出力が発生します。

結論:

ポインターまたは参照を通じて仮想関数を呼び出す場合、デフォルトの引数の動作を注意深く考慮する必要があります。ポインタまたは参照の静的型によって、どのデフォルト引数が使用されるかが決まります。これを正しく理解していないと、予期しない結果が生じる可能性があります。

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

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