0

私の質問は、ほとんど次のコードにあります。ID とコストを持つ抽象オブジェクトへのポインターの配列を作成しようとしています。次に、車や電子レンジなどのオブジェクトを作成し、それらを指すポインターを割り当てます。それらが作成されたら、配列から子データにアクセスするにはどうすればよいですか? それは可能ですか?クラスがヒープで作成され、基本クラス配列でポイントされている場合、子オブジェクトにアクセスするにはどうすればよいですか?

class Object
{
public:
    virtual void outputInfo() =0;

private:
    int id;
    int cost;
};

class Car: public Object
{
public:
    void outputInfo(){cout << "I am a car" << endl;}

private:
    int speed;
    int year;

};

class Toaster: public Object
{
public:
    void outputInfo(){cout << "I am a toaster" << endl;}

private:
    int slots;
    int power;
};


int main()
{
    // Imagine I have 10 objects and don't know what they will be
    Object* objects[10];

    // Let's make the first object
    objects[0] = new Car;

    // Is it possible to access both car's cost, define in the base class and car's speed, define in the child class?

    return 0;
}
4

2 に答える 2

1

protectedアクセス修飾子を使用します。

class Object
{
public:
    virtual void outputInfo() =0;

protected:
    int id;
    int cost;
};

また、印刷 ID、コスト、およびその他のフィールドoutputInfo()のサブクラスでオーバーライドします。Object

オーバーライドされたメソッドを呼び出します -outputInfo()経由で、

Object *object=new Car;
object->outputInfo();
delete object;
于 2012-09-22T05:04:28.500 に答える
0

サブクラスにダウンキャストするには、dynamic_cast を使用する必要があります。

if (Car* car = dynamic_cast<Car*>(objects[0]))
{
    // do what you want with the Car object
}
else if (Toaster* toaster = dynamic_cast<Toaster*>(objects[0]))
{
    // do what you want with the Toaster object
}

dynamic_cast は、オブジェクトの実行時型が実際にそのサブクラスである場合はサブクラス オブジェクトへのポインターを返し、そうでない場合は null ポインターを返します。

于 2012-09-22T05:10:05.117 に答える