このプログラムがこのような出力を作成するのはなぜですか?

anicicn

このプログラムが45、125、300を書き込むのはなぜですか?私は45と300について知っていますが、プログラムが125を書き込むケースsum1(arrD)にもっと興味があります。誰かが知っていることを願っています。

#include <iostream>

using namespace std;

class B{
public:
    B(): b(bCounter++){}
    int b;
    static int bCounter;
};

int B::bCounter = 0;

class D : public B{
public:
    D() : d(bCounter){}
    int d;
};

const int N = 10;
B arrB[N];
D arrD[N];


int sum1(B* arr){
    int s = 0;
    for (int i=0; i<N; i++) s+=arr[i].b;
    return s;
}

int sum2 (D* arr){
    int s = 0;
    for (int i = 0; i<N; i++) s+= arr[i].b + arr[i].d;
    return s;
}

int main(){
    cout<<" result is: "<<sum1(arrB)<<endl;
    cout<<" result is: "<<sum1(arrD)<<endl;
    cout<<" result is: "<<sum2(arrD)<<endl;
    system("pause");
    return 0;
}

静的配列BarrB[N]とDarrD[N]がここで問題を引き起こしているようです。

James Kanze

配列は多形ではありません。単一の要素を期待する場合にのみ、をD*期待する関数にを渡すことができますB*(を使用してみるstd::vectorと、コンパイル時エラーが発生します。)理由は単純です。配列要素にアクセスするために必要なポインター演算は、ポイントされた要素の静的サイズに基づいているためi++、ループ内で行うたびsum1、次にインデックスを作成すると、コンパイラは要素のアドレスを次のように計算しますarr + i * sizeof(B)(マシンレベルで、arrは純粋な型指定されていないアドレスです)。

静的型が動的型と同じでないときにポインタ演算を実行しようとすると、未定義の動作になります。言語に関する限り、何が起こる可能性もあります。

そして、これはまた別の理由ではないCスタイルの配列を使用します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

このhtmlプログラムがこのような出力を提供するのはなぜですか?

分類Dev

このプログラムが出力を生成するのはなぜですか

分類Dev

このプログラムが「1」を出力するのはなぜですか?

分類Dev

このcプログラムの出力がこのようなのはなぜですか?

分類Dev

このプログラムがこの数値を出力するのはなぜですか?

分類Dev

なぜこのプログラムは4を出力するのですか?

分類Dev

このプログラムが2ではなく3を出力するのはなぜですか?

分類Dev

このプログラムの出力が私が思うものではないのはなぜですか

分類Dev

このCコードが興味深い波のようなヒストグラムを作成するデータを出力するのはなぜですか?

分類Dev

このプログラムが最初の文字だけを出力するのはなぜですか?

分類Dev

このプログラムを書くと奇妙な文字列が出力されるのはなぜですか?

分類Dev

このプログラムを書くと奇妙な文字列が出力されるのはなぜですか?

分類Dev

このプログラムが目的の出力を出力しないのはなぜですか?

分類Dev

このPythonプログラムで出力が「bce」ではなく「cbe」になるのはなぜですか?

分類Dev

printf(i)がこのプログラムの出力として0を与えるのはなぜですか?

分類Dev

このHaskellプログラムがバックスラッシュを作成するのはなぜですか?

分類Dev

このプログラムが「4」を出力しないのはなぜですか?

分類Dev

このC ++プログラムが出力を表示しないのはなぜですか?

分類Dev

このCプログラムがunsignedintを出力しないのはなぜですか?

分類Dev

このアセンブリプログラムが出力を生成しないのはなぜですか?

分類Dev

このプログラムが提供した入力を出力しないのはなぜですか?(C)

分類Dev

非常に単純なCプログラムですが、なぜこのような出力が得られるのですか?

分類Dev

このプログラムがループするのはなぜですか?

分類Dev

なぜこのCプログラムは(誤って)2の累乗を多数出力するのですか?

分類Dev

このPythonプログラムに次の出力があるのはなぜですか?

分類Dev

このプログラムの出力が間違っているのはなぜですか?

分類Dev

このプログラムが「forked!」と出力するのはなぜですか。4回?

分類Dev

このプログラムが有効なのはなぜですか?構文エラーを作成しようとしていました

分類Dev

このプログラムが一度表示して入力を要求するのではなく、出力を無限に表示するのはなぜですか

Related 関連記事

  1. 1

    このhtmlプログラムがこのような出力を提供するのはなぜですか?

  2. 2

    このプログラムが出力を生成するのはなぜですか

  3. 3

    このプログラムが「1」を出力するのはなぜですか?

  4. 4

    このcプログラムの出力がこのようなのはなぜですか?

  5. 5

    このプログラムがこの数値を出力するのはなぜですか?

  6. 6

    なぜこのプログラムは4を出力するのですか?

  7. 7

    このプログラムが2ではなく3を出力するのはなぜですか?

  8. 8

    このプログラムの出力が私が思うものではないのはなぜですか

  9. 9

    このCコードが興味深い波のようなヒストグラムを作成するデータを出力するのはなぜですか?

  10. 10

    このプログラムが最初の文字だけを出力するのはなぜですか?

  11. 11

    このプログラムを書くと奇妙な文字列が出力されるのはなぜですか?

  12. 12

    このプログラムを書くと奇妙な文字列が出力されるのはなぜですか?

  13. 13

    このプログラムが目的の出力を出力しないのはなぜですか?

  14. 14

    このPythonプログラムで出力が「bce」ではなく「cbe」になるのはなぜですか?

  15. 15

    printf(i)がこのプログラムの出力として0を与えるのはなぜですか?

  16. 16

    このHaskellプログラムがバックスラッシュを作成するのはなぜですか?

  17. 17

    このプログラムが「4」を出力しないのはなぜですか?

  18. 18

    このC ++プログラムが出力を表示しないのはなぜですか?

  19. 19

    このCプログラムがunsignedintを出力しないのはなぜですか?

  20. 20

    このアセンブリプログラムが出力を生成しないのはなぜですか?

  21. 21

    このプログラムが提供した入力を出力しないのはなぜですか?(C)

  22. 22

    非常に単純なCプログラムですが、なぜこのような出力が得られるのですか?

  23. 23

    このプログラムがループするのはなぜですか?

  24. 24

    なぜこのCプログラムは(誤って)2の累乗を多数出力するのですか?

  25. 25

    このPythonプログラムに次の出力があるのはなぜですか?

  26. 26

    このプログラムの出力が間違っているのはなぜですか?

  27. 27

    このプログラムが「forked!」と出力するのはなぜですか。4回?

  28. 28

    このプログラムが有効なのはなぜですか?構文エラーを作成しようとしていました

  29. 29

    このプログラムが一度表示して入力を要求するのではなく、出力を無限に表示するのはなぜですか

ホットタグ

アーカイブ