我有像下面的代码。 Base是基类,D1,D2,D3是派生类。 D1,D2和D3类对象可以分别保存int,float和double值。 我有一个基类指针向量。它们中的每一个都可以指向任何派生类对象。 通过基类指针,我应该能够获取任何派生类中的数据。如何通过基类指针提供一个函数来获取任何派生对象的数据?
enum Type
{
INT,
FLOAT,
DOUBLE
};
struct Data
{
Type type;
union
{
int iVal;
float fVal;
double dVal;
};
};
class Base
{
public:
virtual Data getData() = 0;
};
class D1: public Base
{
int i;
public:
virtual Data getData()
{
Data data;
data.type = INT;
data.iVal = i;
return data;
}
};
class D2: public Base
{
float f;
public:
virtual Data getData()
{
Data data;
data.type = FLOAT;
data.fVal = f;
return data;
}
};
class D3: public Base
{
double d;
public:
virtual Data getData()
{
Data data;
data.type = DOUBLE;
data.dVal = d;
return data;
}
};
getData()返回数据对象。
使用在数据对象的类型,我需要提取工会对应的值。
我无法回避的类型,即使我使用虚拟函数机制检查。
有没有更好的方法通过单一接口函数返回数据?
编辑:在我的项目场景中,在运行时它可以生成很少的D1对象,很少的D2对象等等。我需要将所有这些对象传递给其他模块。 所以我用vector<Base *>
将所有对象传递到下一个模块。 有没有更好的方法来传递所有的对象?
编辑:任何非升压解决方案存在?
为什么你无法避免类型检查?一切都返回一个'Data',那么需要什么类型检查? – Naveen 2010-08-31 10:45:58
@Naveen:我需要检查数据结构中存在的类型。例如:如果类型是INT,我会去访问data.iVal。 – bjskishore123 2010-08-31 10:48:44
噢好吧..我以为你的意思是你需要检查派生类的类型。 – Naveen 2010-08-31 10:51:35