将 derived 的 QList 转换为 base 的 QList

Cast QList of derived to QList of base

我有这些 类:

class IParameter {};
class ModuleParameter : public IParameter {};

现在我有派生的QList:

QList<ModuleParameter*> list;

当我投单件的时候没问题:

IParameter *p = list[0]; // ok

当我投射列表时出现错误。

QList<IParameter*> *list = static_cast<QList<IParameter*>*>(&list);

Invalid static_cast from type QList<ModuleParameter*>* to type QList<IParameter*>*.

那么,我该如何投射呢?

QList 是一个没有公共基础 class 类型的模板,而 QList<ModuleParameter*> 是与 QList<IParameter*> 无关的类型,您不能多态访​​问 QList<ModuleParameter*>通过指向 QList<IParameter*> 的指针。你想做的事用这种方法是不可能的。

相反,您可以将指向 ModuleParameter 的指针存储在 QList<IParameter*> 中,并在访问它们时使用转换。

如果你真的想要一个 QList,你可以这样做:

    QList<A*> la;
    QList<B*> lb;
    ...
    std::transform(lb.cbegin(),
                   lb.cend(),
                   std::back_inserter(la),
                   [=](B* b)
    {
        return static_cast<A*>(b);
    });