Почему контейнеры STL не предназначены для наследования?
По моему скромному мнению, они есть. Если они не будут, они были сделаны финал . И когда я смотрю на stl_vector.h
источник, я вижу, что моя реализация STL использует защищенное наследование _Vector_base<_Tp, _Alloc>
для предоставления доступа для производных классов:
template<typename _Tp, typename _Alloc = allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
Разве не будет использоваться личное наследование, если подклассы не приветствуются?
существует ли безопасный для стандартов способ создания подклассов с не виртуальными деструкторами (давайте предположим, что я не хочу переопределять какие-либо методы, просто я хочу добавить новые)?
Почему бы не использовать наследование protected
или private
и предоставить нужную часть интерфейса с ключевым словом using
?
class MyVector : private std::vector<int>
{
typedef std::vector<int> Parent;
public:
using Parent::size;
using Parent::push_back;
using Parent::clear;
//and so on + of course required ctors, dtors and operators.
};
Этот подход гарантирует, что пользователь класса не будет понижать экземпляр до std::vector<int>
, и он в безопасности, поскольку единственная проблема с не виртуальным деструктором состоит в том, что он не будет вызывать производный, когда объект удаляется как экземпляр родительского класса.
... У меня также есть дурная идея, что вы даже можете наследовать публично, если в вашем классе нет деструктора. Ересь?