【问题标题】:Best practice when accesessing derived classes in a QList访问 QList 中的派生类时的最佳实践
【发布时间】:2015-04-21 04:15:32
【问题描述】:

我有一个基本模型,我在其中实现了 QAbstractItemModel 的虚拟成员。然后,我根据需要通过派生具有具体细节的新类在项目中使用我的基本模型。

class BaseModel : public QAbstractItemModel{
    public:
        ...

    protected:
        QList<BaseItem*> list;
}

class DerivedModel : public BaseModel{
    public:
        ...
}

class DerivedItem : public BaseItem{
    public:
        ...
}

我的派生模型使用DerivedItem 对象来存储具有BaseItem 没有的一些细节的数据。它们存储在listBaseModel 中的方法也使用 list 中的对象。

我的问题是因为这个我每次在派生模型中从list 访问对象时都必须键入 cast。而且我不能使用像foreach 这样的宏。

在这种情况下,我是否可以使用任何提示或技巧,使我能够使用宏并防止我每次从 list 访问项目时进行类型转换。或者在制作一个公共类以供以后派生时是否有另一种方法(更好的做法)。

谢谢,

【问题讨论】:

    标签: c++ qt polymorphism downcast qlist


    【解决方案1】:

    BaseItem 具有虚拟方法并且DerivedItem 只覆盖BaseItem 的现有成员时,您应该可以调用

    foreach(BaseItem* item, list){
        item->foo();
    }
    

    由于多态性,item-&gt;foo() 将调用 DerivedItem::foo() 如果它属于该类型,否则它将调用 BaseItem::foo()

    【讨论】:

    • 我的问题是我想调用的DerivedItem 的成员在BaseItem 中不存在。 BaseItemonly 有BaseModel 需要的一般成员,而DerivedItem 有更多细节。
    • 那么您可能会想是否可以改进设计,或者您在使用时铸造物品。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2015-09-10
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多