如何将派生类对象添加到基类类型的数组?

时间:2018-09-12 18:30:17

标签: c++ arrays inheritance

不幸的是,我不能使用std::vector,而必须使用普通的C ++数组。我得到以下代码:

class Base
{

}

class DerivedCar : Base
{
public:
    DerivedCar(int a) a(a) {};
private:
    int a;
}

class DerivedHouse : Base
{
  public:
    DerivedHouse(float b) b(b) {};
private:
    float b;  
}

class Vector
{
    Vector() :
    index(0)

    void add(const DerivedCar& car)
    {
       vec[index] = new DerivedCar(car.a);
       index++;
    }

    void add(const DerivedHouse& house)
    {
       vec[index] = new DerivedHouse(house.b);
       index++;
    }

private:
    Vector vec[100];
    int index;
}

int main()
{
    Vector vector;
    DerivedCar car(100);
    DerivedHouse house(2.f);

    vector.add(car);
    vector.add(house);
}

我想拥有一个Base类型的数组,并添加一个派生类型的对象。 除了我所做的以外,还有其他更好的方法吗?使对象复制最少的最佳方法是什么。

2 个答案:

答案 0 :(得分:0)

  

如何将派生类对象添加到基类类型的数组中?

您不能将派生类对象放入原始数组或基类的std::vector中,因为派生类对象通常较大,因此根本不适合该类。

  

是否有比我更好的方法?

肯定有更好的方法。带有多态元素的此类容器的一个很好的示例是boost::base_collection。阅读其文档及其源代码。如果您不了解其中的某些细节,请在Stack Overflow中询问有关该细节的信息。

  

使对象复制最少的最佳方法是什么。

仅包含指向对象和侵入式容器的指针的容器 保持复制对象最少。但是这种容器不 管理对象,因此对象生命周期的责任 被外面的东西带走。

答案 1 :(得分:0)

这是实现链接列表的一种可能方法:

class Base
{

};

class DerivedCar : public Base
{
public:
    DerivedCar(int a) { _a = a; };
private:
    int _a;
};

class DerivedHouse : public Base 
{
public:
    DerivedHouse(float b) { _b = b; };
private:
    float _b;
};

class Object
{
public:
    const Base *data;
    const Object *next; 
};

class Vector 
{
public:
    void add(const Base& v)
    {
        Object item;
        item.data = &v;
        head.next = &item;
        index++;
    }
private:
    Object head;
    int index = 0;
};

int main()
{
    Vector vector;
    DerivedCar car(100);
    DerivedHouse house(2.f);
    vector.add(car);
    vector.add(house);
}