1

を印刷していbvalますが、出力も の値を示しdvalています。コンパイラが使用する実際のロジックは何ですか? 期待される出力は でしたが00000 00000、 として出力されてい00000 01010ます。

#include <iostream>
using namespace std;

class base {
 public:
   int bval;
   base() { bval = 0; }
};

class deri : public base {
  public:
    int dval;
    deri() { dval = 1; }
 };

 void SomeFunc(base *arr , int size) {
   for(int i = 0; i < size; i++, arr++)
     cout << arr-> bval;
   cout<<endl;
 }

 int main() {
   base BaseArr[5];
   SomeFunc(BaseArr, 5);
   deri DeriArr[5];
   SomeFunc(DeriArr, 5);
   return 0;
 }
4

1 に答える 1

3

あなたはシステムをごまかしており、「スライス」しています。

deriは よりも大きいため、baseを実行するarr++と、ポインタはbaseオブジェクトを前方に進めるだけです。

解決策は、ポインターの配列を持ちbase **arr、次のように を渡すことです。

base *foo[5];
base BaseArr[5];
SomeFunc(BaseArr,5);
for(int i = 0; i < 5; i++)
{ 
   foo[i] = &BaseArr[i];
}
SomeFunc(foo, 5);
于 2013-04-24T10:47:35.940 に答える