3

C ++で純粋仮想メソッドを定義する抽象クラスがあります。

class Base
{
Base();
~Base();

virtual bool Test() = 0;
};

これを、A、B、C などと呼ぶ他の多くのクラス (Test() の実装を提供する) でサブクラス化しました。これを使用して、これらの型の配列を作成したいと思います。基本クラス:

int main(int argc, char* argv[])
{
    int size = 0;
    Base* bases = new Base[10];

    bases[size++] = new A();
    bases[size++] = new B();

    for (int i = 0; i < size; i++)
    {
        Base* base = bases[i];
        base->Test();
    }
}

(私が犯した可能性のあるエラーを許してください。簡単な例を提供するために、これをその場で書いています)。

問題は、Base クラスのインスタンスを作成する必要があるため、配列をインスタンス化できないことです (これは抽象的であるため実行できません)。ただし、これを行わないと、配列のインデックスに割り当てるために必要なメモリが割り当てられていないため、そのメモリにアクセスしようとするとセグメンテーション違反が発生します。私は、new と delete を malloc と free と混ぜて使うのは良い習慣ではないという印象を受けています。

これを使用する方法を混乱させた可能性があり、テンプレートまたはその他のメカニズムを使用してこれを行う必要がありますが、何をしようとしているのかを説明するのに十分な情報を提供できれば幸いです.

では、これを行う最善の方法は何ですか?抽象クラスにメモリを割り当てるというこの問題をどのように回避できますか?

ありがとう、ダン

4

3 に答える 3

12

そのコードにはわずかな誤解があります。Base オブジェクトを割り当てる代わりに、ポインターを割り当てる必要があります。ポインタはいつでも存在できます。抽象クラス、不完全型、さらには void へのポインターは有効です。

int main(int argc, char* argv[])
{
    int size = 0;
    Base** bases = new Base*[10];

    bases[size++] = new A();
    bases[size++] = new B();

    for (int i = 0; i < size; i++)
    {
        Base* base = bases[i];
        base->Test();
    }
}
于 2008-12-15T16:47:50.760 に答える
6

まず、デストラクタも仮想として宣言されていることを確認してください。

virtual ~Base();

インスタンスへのポインタの配列を格納する方が良いでしょう:

Base** bases = new Base *[10];
于 2008-12-15T16:49:33.723 に答える
5

配列は、すべての要素が同じサイズであることに依存しています。同じベースから派生した C++ クラスがある場合、インスタンスは任意のサイズにすることができます。したがって、ベースが抽象かどうかに関係なく、ベース インスタンスの配列を割り当てて、そこに派生インスタンスを配置することはできません。

他の回答が言うように、ポインターを使用する必要があります。ベースへのポインターの配列を割り当て、その後、さまざまな派生インスタンスを割り当て、それらへのポインターを配列に格納します。

于 2008-12-15T16:59:07.743 に答える