C の仮想関数でデフォルトの引数はどのように動作しますか?

Barbara Streisand
リリース: 2024-11-10 10:12:02
オリジナル
243 人が閲覧しました

How do Default Arguments Behave in Virtual Functions in C  ?

仮想関数のデフォルトの引数の動作

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)、これは、仮想関数呼び出しでは、オブジェクトを示すポインターまたは参照の静的型によって決定される仮想関数の宣言内のデフォルト引数を使用することを示しています。この場合、型 B (つまり、bp) のポインターを介して print() を呼び出しているため、派生クラス D のオーバーライドされた関数のデフォルトが異なる場合でも、B::print() のデフォルト引数が使用されます。 argument.

したがって、基本クラスのポインターまたは参照を通じて仮想関数を呼び出す場合、オーバーライドされた関数ではなく、基本クラス関数のデフォルトの引数が適用されます。仮想関数とデフォルト引数を操作する際の混乱や予期せぬ結果を避けるために、この動作を理解することが重要です。

以上がC の仮想関数でデフォルトの引数はどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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