Причина, по которой STL возвращает ссылки, состоит в том, что шаблонный код не может позволить себе роскошь знать, что возвращаемые объекты малы.Хотя int
не проблема, возвращение большой структуры замедляет процесс без веской причины.В последнем случае имеет смысл использовать ссылки, и поскольку разумный компилятор может оптимизировать случай использования примитивных типов, вы также можете использовать ссылки повсюду.
Обратите внимание, что ваш метод virtual T get(const int index)
отличается другими способами.к контейнерным методам STL.Что наиболее важно и связано с вышеупомянутой проблемой, ваш метод возвращает копию индексированного объекта: манипулирование результатом не изменит состояния объекта в вашем контейнере.
Кроме того, объявление аргумента индекса как const
ничего не делает, так как вы передаете index
по значению, и все, что вы делаете, это предотвращает локальное изменение index
в рамках реализации.Если вы передавали index
по ссылке, это было бы другим делом, но вы должны быть осторожными в этом.
Наконец, действительно ли вы уверены, что ваш класс должен бытьдинамически полиморфный (т.е. есть виртуальные методы)?Контейнеры STL специально предназначены для того, чтобы не наследоваться (поэтому у них нет virtual
деструкторов).Контейнеры не предназначены для обеспечения интерфейса для производных классов, скорее они существуют для облегчения реализации.Я бы сказал, что предлагаемые вами примеры подклассов могут быть так же легко реализованы, как и классы-обертки вокруг шаблонного контейнера, предпочитая повторное использование кода через композицию, а не наследование (что, среди прочего, поддерживает Gang of Four ).Помимо хорошей практики, избегание использования virtual
методов избавляет от наличия vtables и соответствующих указателей в ваших объектах и требует дополнительного поиска vtable в каждом вызове.Если вам действительно не нужен динамический полиморфизм, зачем брать цену (и, возможно, предотвращать оптимизацию компилятора)?