【问题标题】:Is this use of QMap potentially harmful?使用 QMap 是否可能有害?
【发布时间】:2023-03-16 01:36:01
【问题描述】:
#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 不适合多态使用(没有虚拟析构函数)。

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

【问题讨论】:

    标签: c++ qt qmap qmultimap


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!一般情况如何?如果我在没有虚拟性的情况下声明 Base::f() 和 Derived::f() 并将 Derived 的实例静态绑定到 Base::f() 是否被认为是滥用?这个对象是切片的吗?
    • 这是安全的,它不是切片。 (切片是从 Derived 构造 Base 的实例。这里,因为 QMultiMap 作为引用传递,所以什么都没有构造,这很好:QMultiMap “是”QMap;这就是继承的意思。)
    猜你喜欢
    • 2013-07-26
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多