这是一些得到我遇到的错误的代表性代码:
class Data
{
};
class Table
{
virtual std::vector<Data*> getData() = 0;
virtual void putData(Data* dataItem) = 0;
virtual Data* getData(int index) = 0;
};
class DerivedData : Data
{
};
class DerivedTable : Table
{
std::vector<DerivedData*> getData() { return myData; } // invalid covariant return type
void putData(DerivedData *dataItem) { myData.push_back(dataItem); }
virtual DerivedData* getData(int index) { return myData[index]; } // invalid covariant return type
std::vector<DerivedData*> myData;
};
首先,我不太明白为什么 putData 的覆盖对更改的参数感到满意,但是我无法更改 getData 的返回类型,尽管我很欣赏这是我可以从更多了解的东西阅读。
其次,也是我的主要问题,如何更改此代码以使其正常工作。我的基本目标是允许多个“表”之类的对象来存储和控制数据对象。虽然每个数据对象都有一些共同点,但表格将控制和使用一些明显的差异。例如,一个表可能具有带有名称参数的数据对象,因此该表将提供一个函数,该函数打印出它所拥有的所有数据名称的列表。通过这种方式,我可以拥有适用于所有这些表对象的通用代码,以及只适用于一种类型的表的专用代码。