1

次のクラスがあります。

class A {
};

class B : public A {
  int num;
};

私のメインでは:

int main() {
    A* vec; // A is a class with pure virtual functions
    vec = new B[2]; // want to create a vector of B
}

vec[0] は正しく定義されていますが、vec[1] は NULL です。なぜフィットメモリを割り当てなかったのですか?

メインの行を変更したくありません。それを機能させるだけです。

(メインを B* vec = new B[2] に変更できることはわかっていますが、したくありません)

どんな助けでも大歓迎です!

4

3 に答える 3

5

配列をポリモーフィックに扱うことはできません。C++ 言語ではサポートされていません。この式vec[x]は、ポインター演算を使用して要素の位置を決定します。基本クラスのポインターを介してアクセスしている場合、オブジェクトのサイズが何らかの形で変化すると機能しません。

たとえば、サイズが 4 バイトの基本クラスがあり、サブクラスのサイズが 8 バイトであるとします。

base *a = new child[4];

アクセスa[1]すると、コンパイラは基本クラスのサイズを使用してオフセットを計算します。この場合、オフセットは 4 バイトで、最終的に最初の要素の中央を指します。

適切なスマート ポインターでポインターstd::vectorまたはポインターを使用することをお勧めします。std::array

// For arrays that needs to be resized (requires delete for each new)
std::vector<A*> vec(5, NULL);
for(int i = 0; i < vec.size(); i++)
{
    vec[i] = new B();
}

// for arrays that are fixed in size (requires delete for each new)
std::array<A*, 5> vec;
for(int i = 0; i < vec.size(); i++)
{
    vec[i] = new B();
}

// for arrays that are fixed in size with smart pointers
// no delete needed 
std::array<std::unique_ptr<A>, 5> vec;
for(int i = 0; i < vec.size(); i++)
{
    vec[i].reset(new B());
}
于 2013-05-16T14:00:22.757 に答える
1

ポリモーフィックにしたい場合は、ポインターの配列を作成するだけです

new A*[array_size]

于 2013-05-16T14:08:08.103 に答える
0

このコード スニペットは、発生している問題を示しています。

#include <iostream>
using namespace std;
class A {
};

class B : public A {
  int num;
};

int main() {
    A* vec; // A is a class with pure virtual functions
    vec = new B[2]; // want to create a vector of B

    cout << sizeof(vec) << endl;
    cout << sizeof(*vec) << endl;
    cout << sizeof(vec[2]) << endl;
    cout << sizeof(new B()) << endl;
}

ポインター算術では、割り当てたポインターの型のサイズは、それが指しているオブジェクトの真の型のサイズではなく、インクリメントに使用されるものです。もっと簡単に言えば、言語は多相配列をサポートしていません。これは単に理由の説明です。

于 2013-05-16T14:05:27.447 に答える