1
#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静的にバインドされます。これは、ポリモーフィックな使用 (仮想デストラクタなし) を意図していないためです。QMapQMultiMapQMap

この使用が何と呼ばれているのかさえわかりません。オブジェクトのスライスですか?

4

1 に答える 1

3

これは安全であるべきだと思います。QMultiMap は、オーバーロードされたメソッドの新しいセットを QMap に追加するだけです。QMultiMap でオーバーロードされている lastKeyOf() 内の関数を使用して異なる動作をさせると、予期しない結果しか得られません。私が見ることができる唯一のオーバーロードされたメソッドは、互換性のある署名と異なる動作を持ち、insert() です。

そうは言っても、QMultiMap を回避し、QMap::insert() の代わりに QMap::insertMulti() でのみ QMap を使用する、より単純なコードになる可能性があります。

于 2013-05-20T14:41:20.690 に答える