gpt4 book ai didi

c++ - 指向基的指针可以指向派生对象数组吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:29:12 25 4
gpt4 key购买 nike

我今天去参加工作面试,并被问到这个有趣的问题。

除了内存泄漏和没有虚拟 dtor 之外,为什么这段代码会崩溃?

#include <iostream>

//besides the obvious mem leak, why does this code crash?

class Shape
{
public:
virtual void draw() const = 0;
};

class Circle : public Shape
{
public:
virtual void draw() const { }

int radius;
};

class Rectangle : public Shape
{
public:
virtual void draw() const { }

int height;
int width;
};

int main()
{
Shape * shapes = new Rectangle[10];
for (int i = 0; i < 10; ++i)
shapes[i].draw();
}

最佳答案

你不能那样索引。您已经分配了一个 Rectangles 数组,并在 shapes 中存储了指向第一个的指针。当您执行 shapes[1] 时,您将取消引用 (shapes + 1)。这不会为您提供指向下一个 Rectangle 的指针,而是一个指向假定的 Shape 数组中的下一个 Shape 的指针。当然,这是未定义的行为。在你的情况下,你很幸运并且遇到了崩溃。

使用指向 Rectangle 的指针可以使索引正常工作。

int main()
{
Rectangle * shapes = new Rectangle[10];
for (int i = 0; i < 10; ++i) shapes[i].draw();
}

如果您想在数组中包含不同类型的 Shape 并以多态方式使用它们,您需要一个指向 Shape 的指针数组。

关于c++ - 指向基的指针可以指向派生对象数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59338906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com