私が経験しているエラーを取得する代表的なコードを次に示します。
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 の戻り値の型を変更することはできません。読む。
次に、私の主な質問ですが、このコードを変更して機能させるにはどうすればよいでしょうか。私の基本的な目標は、データ オブジェクトを格納および制御する複数の「テーブル」のようなオブジェクトを許可することです。各データ オブジェクトにはいくつかの共通点がありますが、テーブルが制御および操作するいくつかの明確な違いがあります。たとえば、1 つのテーブルに name パラメータを持つデータ オブジェクトがある場合、そのテーブルは保持するデータのすべての名前のリストを出力する関数を提供します。このようにして、これらすべてのテーブル オブジェクトで動作する汎用コードと、1 種類のテーブルのみで動作する特殊なコードを作成できます。