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。为什么它没有给我分配合适的内存?

我不想改变主线。让它工作。

(我知道我可以将 main 更改为: B* vec = new B[2] 但我不想要)

任何帮助表示赞赏!

4

3 回答 3

5

您不能多态地处理数组,C++ 语言不支持它。该表达式vec[x]使用指针算法来确定元素的位置。如果您通过基类指针访问它,那么如果对象的大小以任何方式发生变化,它将不起作用。

例如,您的基类大小为 4 个字节,子类大小为 8 个字节。

base *a = new child[4];

当您访问时a[1],编译器会使用基类的大小来计算偏移量。在这种情况下,偏移量是 4 个字节,最终指向第一个元素的中间。

我建议将 a std::vectoror std::arrayof 指针与适当的智能指针一起使用。

// 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 回答