Alo*_*iel 1 c++ polymorphism memory-management pointer-arithmetic
我有下一堂课:
class A {
};
class B : public A {
int num;
};
Run Code Online (Sandbox Code Playgroud)
在我的主要我有:
int main() {
A* vec; // A is a class with pure virtual functions
vec = new B[2]; // want to create a vector of B
}
Run Code Online (Sandbox Code Playgroud)
正确定义了vec [0],但vec [1]为NULL.为什么不给我一个合适的记忆?
我不想改变主线.只是让它工作.
(我知道我可以把主要改成:B*vec = new B [2]但我不想要)
任何帮助赞赏!
您无法以多态方式处理数组,C++语言不支持它.表达式vec[x]使用指针算法来确定元素的位置.如果您通过基类指针访问它,如果对象的大小以任何方式变化,它将无法工作.
例如,您的基类大小为4个字节,子类的大小为8个字节.
base *a = new child[4];
Run Code Online (Sandbox Code Playgroud)
访问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());
}
Run Code Online (Sandbox Code Playgroud)