C++ 创建不同对象的数组

C++ 创建不同对象的数组,c++,inheritance,casting,C++,Inheritance,Casting,这是我最后一个问题的后续问题,我需要一个对象数组,这些对象是一个基类的子类。有人建议我尝试动态施法,但速度在这个项目中非常重要 这基本上就是我想要的 class Object { protected: int id; }; class Bike: public Object { public: bike(); private: int bells; }; class Car: public Object { public: void drive(); pr

这是我最后一个问题的后续问题,我需要一个对象数组,这些对象是一个基类的子类。有人建议我尝试动态施法,但速度在这个项目中非常重要

这基本上就是我想要的

class Object
{
protected:
    int id;
};

class Bike: public Object
{
public:
    bike();

private:
    int bells;
};

class Car: public Object
{
public:
    void drive();

private:
    int wheels;
};
我需要这些对象的数组,所以我决定使用基类

// 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;
我听说动态铸造是个好主意。问题是速度很重要,我有需要执行以下操作的实例:

  • 汽车8以索引值3引用自行车
  • 没有动态_铸造,还有其他解决方法吗


    编辑:如果我用一堆子类填充数组,我如何访问特定索引处的子类数据。换句话说,假设一辆自行车的指数为8。如何仅使用数组和索引从该对象获取int bell。

    如果对象不同,为什么要使用基类?
    此链接可能会有所帮助:

    如果对象不同,为什么要有基类?
    此链接可能会有所帮助:

    这取决于您正在执行的其他操作,但您可以拥有一个结构数组,用于存储枚举,该枚举指定它正在存储的对象类型以及对象指针

    即:

    在遍历数组时,可以检查对象的类型,然后将对象指针静态转换为相应的派生类型。在无法避免的情况下,我广泛使用这种方法,并且在通用容器中绝对需要对对象类型进行运行时标识


    但是,为什么需要在同一数组中存储不同类的对象,而不使用多态性和虚拟方法?

    这取决于您正在执行的其他操作,但是您可以有一个结构数组来存储枚举,该枚举指定要存储的对象类型以及对象指针

    即:

    在遍历数组时,可以检查对象的类型,然后将对象指针静态转换为相应的派生类型。在无法避免的情况下,我广泛使用这种方法,并且在通用容器中绝对需要对对象类型进行运行时标识


    但是,为什么需要在同一数组中存储不同类的对象,而不使用多态性和虚拟方法?

    首先,如果需要非常快的速度,请不要在堆上使用新操作符创建它。如果可能,您需要在本地创建它们

    如果您确信始终存在您的对象,那么可以将强制转换为静态强制转换,这是一个更快的解决方案

    对我来说,这里最好的方法是使用纯虚拟方法的接口。比如:

    Class Objects //interface
    {
    public:
       virtual void ride() = 0;
    }
    

    然后使用接口作为基类。这在编程中非常常见。

    首先,如果需要非常快的速度,请不要使用new操作符在堆上创建它。如果可能,您需要在本地创建它们

    如果您确信始终存在您的对象,那么可以将强制转换为静态强制转换,这是一个更快的解决方案

    对我来说,这里最好的方法是使用纯虚拟方法的接口。比如:

    Class Objects //interface
    {
    public:
       virtual void ride() = 0;
    }
    

    然后使用接口作为基类。这在编程中非常常见。

    无论实现看起来如何,您的问题都需要一些运行时开销:这是因为在某个时候,程序需要决定它实际存储的类型。请注意,如果您能负担得起使用Boost,那么除了引入一点人工继承,您还有更多的选择:

    • -如果您提前知道要存储的所有类型
    • -如果你没有

    无论实现如何,您的问题似乎都需要一些运行时开销:这是因为在某个时候,程序需要决定它实际存储的类型。请注意,如果您能负担得起使用Boost,那么除了引入一点人工继承,您还有更多的选择:

    • -如果您提前知道要存储的所有类型
    • -如果你没有

    您是否实际测量了
    动态\u cast的性能问题
    ?为什么需要强制执行?当您将它们保存在一个数组中时,我假设您希望对该数组中的元素调用一些多态方法,而不需要知道这些对象的确切类型。如果不是,我不会让您的实际用例在单个数组中存储不同类型的对象@Vikdor如果我用子类填充数组,比如说在索引5,比如说是一辆车,它希望我访问一辆自行车,比如说在索引3。如何访问索引3处的子类?换句话说,从子类获取特定索引处的数据。请记住,它是一个基类数组。为什么C++不支持这个?FWW,从你的回复,没有更多的用例背景,我不明白子类的对象如何给我一个数组中的另一个对象的索引。我的直觉是,这种存储不同类型对象的方法是不正确的。您是否实际测量了
    动态\u cast
    的性能问题?为什么需要强制转换?当您将它们保存在一个数组中时,我假设您希望对该数组中的元素调用一些多态方法,而不需要知道这些对象的确切类型。如果不是,我不会让您的实际用例在单个数组中存储不同类型的对象@Vikdor如果我用子类填充数组,比如说在索引5,比如说是一辆车,它希望我访问一辆自行车,比如说在索引3。如何访问索引3处的子类?换句话说,从子类获取特定索引处的数据。请记住,它是一个基类数组。为什么C++不支持这个?FWW,从你的回复,没有更多的背景,我们只是不明白孩子的目标是什么