このプログラムが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]
がここで問題を引き起こしているようです。
配列は多形ではありません。単一の要素を期待する場合にのみ、をD*
期待する関数にを渡すことができますB*
。(を使用してみるstd::vector
と、コンパイル時エラーが発生します。)理由は単純です。配列要素にアクセスするために必要なポインター演算は、ポイントされた要素の静的サイズに基づいているためi++
、ループ内で行うたびにsum1
、次にインデックスを作成すると、コンパイラは要素のアドレスを次のように計算しますarr + i * sizeof(B)
(マシンレベルで、arr
は純粋な型指定されていないアドレスです)。
静的型が動的型と同じでないときにポインタ演算を実行しようとすると、未定義の動作になります。言語に関する限り、何が起こる可能性もあります。
そして、これはまた別の理由ではないCスタイルの配列を使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加