1

这是我最后一个问题的后续,其中我需要一组对象,它们是一个基类的子类。有人建议我尝试 dynamic_cast 但速度在这个项目中非常重要。

这基本上就是我所追求的。

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;

有人告诉我动态铸造是个好主意。问题是速度很重要,我有一些实例需要执行以下操作:

  1. Car 8 引用索引值为 3 的自行车。

没有dynamic_casting还有其他解决方法吗?

编辑:如果我用一堆子类填充数组,我怎么能在特定索引处访问子类的数据。换句话说,想象一辆自行车的索引为 8。我怎么能从该对象中仅使用数组和索引获取 int 铃声。

4

4 回答 4

1

这取决于您在做什么,但您可以拥有一个结构数组,其中存储一个枚举,该枚举指定它存储的对象类型以及对象指针。

IE:

class CObject;

enum EObjectType
{
    OT_Bike,
    OT_Car
};

struct SObjectInfo
{
    EObjectType Type;
    CObject* Object;
};

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

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

于 2012-09-22T09:28:24.470 回答
0

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

于 2012-09-22T09:42:16.117 回答
0

如果对象不同,为什么要有基类?此链接可能会有所帮助: http: //www.codeproject.com/Articles/23304/High-Performance-Heterogeneous-Container

于 2012-09-22T09:23:51.527 回答
0

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

如果您确定总会有您的对象,那么您可以将转换更改为 static_cast,这是一个更快的解决方案。

对我来说,这里最好的想法是使用带有纯虚拟方法的接口。喜欢:

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

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

于 2012-09-22T09:28:55.333 回答