Является ли такое использование QMap потенциально опасным?

#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 не предназначался для полиморфного использования (без виртуального деструктора).

Я даже не знаю, как называется это использование. Это нарезка объектов?


person Martin Drozdik    schedule 20.05.2013    source источник


Ответы (1)


Я считаю, что это должно быть безопасно. QMultiMap просто добавляет новый набор перегруженных методов в QMap, вы получите неожиданные результаты, только если будете использовать функцию внутри lastKeyOf(), которая перегружена в QMultiMap для другого поведения. Единственный перегруженный метод с совместимой сигнатурой и другим поведением, который я вижу, это insert().

Сказав это, можно сделать более простым код, чтобы избежать QMultiMap и использовать QMap только с QMap::insertMulti() вместо QMap::insert().

person Robert Knight    schedule 20.05.2013
comment
Благодарю вас! Как насчет общего случая? Если я объявлю Base::f() и Derived::f() без виртуальности и статически привяжу экземпляр Derived к Base::f(), считается ли это неправильным использованием? Является ли этот объект нарезкой? - person Martin Drozdik; 20.05.2013
comment
Это безопасно и не режет. (Нарезка — это создание экземпляра Base из Derived. Здесь, поскольку QMultiMap передается как ссылка, ничего не создается, и это нормально: QMultiMap — это QMap; вот что означает наследование.) - person Nicholas Wilson; 20.05.2013