3

hi i am develop a class that manage multiples data types, by so i have created a class wrapper that can contain a diverse types of data, but a im stuck with a compiler issue:

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;
}

This code generate the following compiler error:

error: cannot declare field 'MValueData::mTypeData' to be of abstract type 'BaseType'

the mTypeData menber variable is declared as it, but it is derived from basetype, i dont see the error. Thx in advance

4

4 回答 4

3

即使您的基类不是抽象的,您仍然会面临切片问题。

参见例如this answer描述这意味着什么

因此,您需要存储一个BaseType指针。

于 2013-09-23T14:45:34.337 回答
2

您不能创建类型为抽象的变量。由于 BaseType 是抽象的(它具有纯虚函数BaseType::clone),因此您不能声明该类型的变量。您可以存储对 BaseType 的引用或指向 BaseType 的指针,但不能存储 BaseType。

于 2013-09-23T14:35:44.380 回答
1

您不能按值存储mTypeDataBaseType这将删除所有对它的DataType引用 这意味着您将拥有一个抽象类的实例,这是不允许的。

如果您希望将子类存储为其父类,则需要将其存储为 aBaseType*然后用new DataType(aAnyValue).

于 2013-09-23T14:35:55.767 回答
0

您不能拥有 BaseType 的对象,因为它是一个抽象类。

于 2013-09-23T14:35:49.873 回答