Я имею дело с Qt + C ++ (x11).
У меня есть базовый класс и несколько подклассов, которые возвращают новый указатель на этот подкласс (ковариантный). Мне нужно также вернуть контейнер (QList) этих подклассов. Пример:
class A
{
public:
int id;
}
class B : public A
{
int Age;
};
class WorkerA
{
public:
virtual A *newOne() {return new A()};
virtual QList<A*> *newOnes {
QList<A*> list = new QList<A*>;
//Perform some data search and insert it in list, this is only simple example. In real world it will call a virtual method to fill member data overriden in each subclass.
A* a = this.newOne();
a.id = 0;
list.append(this.newOne());
return list;
};
};
class WorkerB
{
public:
virtual B *newOne() override {return new B()}; //This compiles OK (covariant)
virtual QList<B*> *newOnes override { //This fails (QList<B*> is not covariant of QList<A*>)
(...)
};
};
Это не удастся скомпилировать, потому что QList - это совершенно другой тип, чем QList. Но что-то подобное было бы неплохо. В реальном мире B будет иметь больше элементов данных, чем A, и будет C, D ..., следовательно, необходимо «ковариантно» возвращать список. Я буду намного лучше:
WorkerB wb;
//some calls to wb...
QList<B*> *bList = wb.newOnes();
B* b = bList.at(0); //please excuse the absence of list size checking
info(b.id);
info(b.age);
, чем
WorkerB wb;
//some calls to wb...
QList<A*> *bList = wb.newOnes();
B* b = static_cast<B*>(bList.at(0)); //please excuse the absence of list size checking
info(b.id);
info(b.age);
Есть ли способ добиться этого?