使用 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<TKey, TValue>
。所以如果我打电话:
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 是不是可能有害?的主要内容,如果未能解决你的问题,请参考以下文章