使用 QMap 是不是可能有害?

Posted

技术标签:

【中文标题】使用 QMap 是不是可能有害?【英文标题】:Is this use of QMap potentially harmful?使用 QMap 是否可能有害? 【发布时间】:2013-05-20 14:25:37 【问题描述】:
#include <QMultiMap>

template <typename TKey, typename TValue>
TKey lastKeyOf(const QMap<TKey, TValue>& map)

    if (map.isEmpty())
        throw something;
    return (map.end() - 1).key();

我问的原因是:

template <typename TKey, typename TValue>
QMultiMap<TKey, TValue>;

公开继承QMap&lt;TKey, TValue&gt;。所以如果我打电话:

QMultiMap<int, std::string> multimap;
...
lastKeyOf(multimap);

lastKeyOf 中的所有调用都静态绑定到它们的 QMap 版本,而不是 QMultiMap 版本,因为 QMap 不适合多态使用(没有虚拟析构函数)。

我什至不确定这个用途叫什么。是对象切片吗?

【问题讨论】:

【参考方案1】:

我相信这应该是安全的。 QMultiMap 只是向 QMap 添加了一组新的重载方法,如果您使用 QMultiMap 中重载的 lastKeyOf() 中的函数以具有不同的行为,您只会得到意想不到的结果。我能看到的唯一具有兼容签名和不同行为的重载方法是 insert()。

话虽如此,它可能会编写更直接的代码来避免 QMultiMap 并仅将 QMap 与 QMap::insertMulti() 一起使用而不是 QMap::insert()。

【讨论】:

谢谢!一般情况如何?如果我在没有虚拟性的情况下声明 Base::f() 和 Derived::f() 并将 Derived 的实例静态绑定到 Base::f() 是否被认为是滥用?这个对象是切片的吗? 这是安全的,它不是切片。 (切片是从 Derived 构造 Base 的实例。这里,因为 QMultiMap 作为引用传递,所以什么都没有构造,这很好:QMultiMap “是”QMap;这就是继承的意思。)

以上是关于使用 QMap 是不是可能有害?的主要内容,如果未能解决你的问题,请参考以下文章

第三十七课深度解析QMap与QHash

Qt532.容器QMap&QMultiMap

QMap 和 QMultiMap 中的项目顺序

第37课 深度解析QMap与QHash

QVector与QMap查找效率实战(QMap快N倍)

QMap::insertMulti 还是 QMultiMap?