質問

    

この質問にはすでに回答があります:

    
            
  •             言及された場所でこのコードがクラッシュする理由                                      7つの答え                          
  •     
    

クラスAがあります:

class A
{
    public:
        virtual double getValue() = 0;
}

クラスB:

class B : public A
{
    public:
        virtual double getValue() { return 0.0; }
}

そしてmain()で私がやる:

A * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //This, or any other index besides 0, causes the program to quit

代わりに行う場合:

B * var;
var = new B[100];
std::cout << var[0].getValue(); //This works fine
std::cout << var[1].getValue(); //Everything else works fine too

すべてが正常にコンパイルされますが、多態性に何か問題があるようです。困惑しています。

役に立ちましたか?

解決

配列を多態的に扱うことはできません。そのため、 new B [100] B オブジェクトの配列を作成し、配列へのポインターを返します。配列の要素-このポインターを基本クラスへのポインターに割り当てることは有効ですが、これを A オブジェクトの配列へのポインターとして扱うことは無効です。

できない主な理由は、(通常)派生オブジェクトのサイズが基本クラスと異なるため、基本クラスオブジェクトの配列として配列にアクセスしようとしても、正しいオフセットを使用してポインターを取得できないためです派生クラス配列の次のメンバーの次の基本クラスサブオブジェクトに。

他のヒント

多態性には問題はありませんが、メモリの処理方法には問題があります。 []演算子は、最初の場合はsizeof(A)バイト、2番目の場合はsizeof(B)バイトだけ配列を進めます。オブジェクトはタイプBであるため、A *はメモリ内の正しい場所を指していません。

別の見方です

char * var;
var = (char*) new B[100];
std::cout << ((A*)var[0]).getValue(); //This works fine
std::cout << ((A*)var[1]).getValue(); //This will fail
std::cout << ((A*)var[sizeof(B)]).getValue(); // should work

配列内のオブジェクトを割り当てませんでした:

for (int i=0;i<100;i++)
  var[i] = new B;

(C ++とC#を混同しているかもしれませんが)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top