0

だから私はトップクラスを持っているとしましょう:

//Top.h
#pragma once
#include <string>
using std::string;

class Top
{
    protected:
        string name;
    public:
        virtual string GetName() = 0;
}

このクラスにはオブジェクト Top インスタンスがありません。それが抽象クラスである理由です。私には2つのミドルクラスもあります。

//MiddleA.h
#pragma once
#include "Top.h"

class MiddleA : public Top
{
    protected:
        int value;
    public:
        MiddleA(string, int);
        string GetName();
        int GetValue();
}

//MiddleB.h
class MiddleB : public Top
{
    protected:
        double factorial;
    public:
        MiddleB(string, double);
        string GetName();
        double GetFactorial();
        double Calculate(int);
}

ここで必要なのは、MiddleA、MiddleB、またはこれら 2 つのクラスから継承する任意のクラスの複数のオブジェクトを格納できる配列などです。C++でこれを行う方法はありますか?

編集:保護されたセクションにデフォルトのコンストラクターを追加し、Top のベクトルまたは配列を使用することは「受け入れられる」でしょうか?

4

2 に答える 2

3

C++ のポインターと配列を使用します。

typedef std::array<std::unique_ptr<Top>,3> Tops;
Tops tops =
{{
    new MiddleA( "Kuku", 1337 ),
    new MiddleB( "Hoi", 42.0 ),
    new MiddleC()
}};

トップに仮想デストラクタが必要な唯一のもの。仮想デストラクタがないと、shared_ptr のみを使用できます。その他のデバイスでは、オブジェクトが破棄されたときに未定義の動作が発生します。

于 2012-10-17T20:47:35.240 に答える
1

はい。このようにできます。

Top* array[3] = { new Top(parms), new MiddleA(params), new MiddleB(params) };

ただし、GetName() 関数しか呼び出すことができません。他のメソッドを呼び出すことはできません。

于 2012-10-17T20:41:56.837 に答える