这是我上一个问题的后续内容,其中我需要一个对象数组,这些对象是一个基类的子类。有人建议我尝试使用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;
我被告知动态铸造是一个好主意。问题是速度很重要,我需要进行以下操作:
没有dynamic_casting还有其他解决方法吗?
编辑:如果我用一堆子类填充数组,我怎么能在特定索引处访问子类的数据。换句话说,假设一辆自行车在索引8处。我怎样才能从该对象获得带有数组和索引的int响铃。
答案 0 :(得分:1)
这取决于你正在做什么,但你可以有一个存储枚举的结构数组,它指定它与对象指针一起存储的对象类型。
IE:
class CObject;
enum EObjectType
{
OT_Bike,
OT_Car
};
struct SObjectInfo
{
EObjectType Type;
CObject* Object;
};
迭代数组时,可以检查对象的类型,然后 static 将对象指针强制转换为相应的派生类型。我在无法避免的情况下广泛使用这种方法,并且在通用容器中绝对需要运行时识别对象类型。
为什么不使用多态和虚方法,需要在同一个数组中存储不同类的对象?
答案 1 :(得分:0)
如果对象不同,为什么要有基类? 此链接可能有所帮助:http://www.codeproject.com/Articles/23304/High-Performance-Heterogeneous-Container
答案 2 :(得分:0)
首先,如果您需要它非常快,请不要使用operator new在堆上创建它。如果可能,您需要在本地创建它们。
如果您确定总会有对象,那么您可以将转换更改为static_cast,这是一个更快的解决方案。
对我来说,这里最好的想法是使用纯虚拟方法的接口。像:
Class Objects //interface
{
public:
virtual void ride() = 0;
}
然后使用接口作为基类。这在编程中很常见。
答案 3 :(得分:0)
看起来您的问题需要一些运行时开销,无论实现方式如何:这是因为在某些时候程序需要决定它实际存储的类型。请注意,除了使用Boost:
之外,您还可以选择引入一点人工继承