private
Наследование - общая тактика для создания классов, которые реализуются в терминах другого. Код, который использует класс, не может сказать, что производный класс получен из частной базы, поэтому вы не окажетесь в ситуациях, которые обычно требуют виртуального деструктора.
Используйте команду using
для импорта элементов из частной базы в производный класс. Например:
template<class T>
class List:
private std::vector<T>
{
public:
using std::vector<T>::operator[];
using std::vector<T>::size;
};
Это немного грубо, но это дает вам некоторую гибкость. Вы можете начать с использования частного наследования, и это экономит вас при наборе текста по сравнению с написанием функций пересылки, но вы по-прежнему можете писать альтернативные варианты реализации по требованию. И тогда, если/когда это станет неуместным, вы можете изменить стиль реализации - возможно, например, в качестве члена есть vector
, например, или, может быть, сделать все вручную без необходимости знать, что код клиента не потребуется изменять ,
Это идеальное решение для ситуаций, когда вы уверены, что в конечном итоге вам понадобится нестандартный тип контейнера, но у вас есть существующий тип контейнера, который в настоящее время больше подходит для счета. И это лучшее среднесрочное решение, чем typedef
, потому что нет никакого риска для кода клиента случайно (или по назначению ...), используя два типа взаимозаменяемо.
Его никто не назвал вектором списка. Когда вы говорите список, мы ожидаем определенные внутренние поведенческие модели. Вектор не обеспечивает эти поведения.Например, вставляя в середину списка, я ожидал бы постоянного времени (это не верно для вектора). –
Взгляните на boost :: ptr_list, он должен делать то, что вы хотите. –
@ Мартин: Он не думает о std :: list; другие языки/среды используют «список», где C++ использует «вектор». – 2010-09-21 22:22:31