1. ホーム
  2. c++

[解決済み] ベースへのポインタは、派生オブジェクトの配列を指すことができますか?

2023-01-01 22:38:29

質問

今日、面接に行ったのですが、こんな面白い質問をされました。

メモリ リークと仮想 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 を持ち、それらを多義的に使用したい場合は、配列に ポインタ へのポインタの配列が必要です。