您正在开发一个管理多个数据类型的类,因此我创建了一个类包装器,它可以包含各种类型的数据,但是我遇到了编译器问题:
class BaseType{
public:
virtual ~BaseType(){}
virtual BaseType & clone() const =0;
};
template<typename T>
class DataType : public BaseType
{
public:
DataType(const T & aValueData = T()):mValue(aValueData) {}
BaseType & clone() const
{
return DataType<T>();
}
private:
T mValue;
};
class MValueData
{
public:
template<typename T>
MValueData(T & aAnyValue = DataType(aAnyValue)):mTypeData(aAnyValue)
{}
private:
BaseType mTypeData;
};
int main()
{
return 0;
}
此代码生成以下编译器错误:
error: cannot declare field 'MValueData::mTypeData' to be of abstract type 'BaseType'
mTypeData menber变量被声明为它,但它是从basetype派生的,我没有看到错误。 Thx提前
答案 0 :(得分:3)
答案 1 :(得分:2)
您无法创建类型为抽象的变量。由于BaseType是抽象的(它具有纯虚函数BaseType::clone
),因此您无法声明该类型的变量。您可以存储对BaseType的引用或指向BaseType的引用,但不能存储BaseType。
答案 2 :(得分:1)
您不能将mTypeData
按BaseType
值存储,这将删除对DataType
的所有引用;这意味着你将拥有一个抽象类的实例,这是不允许的。
如果您希望将子类存储为其父类,则需要将其存储为BaseType*
,然后使用new DataType(aAnyValue)
对其进行实例化。
答案 3 :(得分:0)
你不能拥有BaseType的对象,因为它是一个抽象类。