private
наследование является распространенной тактикой для создания классов, которые реализуются в терминах другого.Код, использующий класс, не может сказать, что производный класс является производным от частной базы, поэтому вы не попадете в ситуации, когда обычно требуется виртуальный деструктор.
Использование using
импортировать членов из частной базы в производный класс.Например:
template<class T>
class List:
private std::vector<T>
{
public:
using std::vector<T>::operator[];
using std::vector<T>::size;
};
Это немного грубо, но дает вам некоторую гибкость.Вы можете начать с использования частного наследования, и это сэкономит вам некоторую типизацию по сравнению с написанием функций пересылки, но вы по-прежнему можете писать альтернативные реализации длинным способом, как требуется.И затем, если / когда это становится неуместным, вы можете изменить стиль реализации - возможно, иметь vector
в качестве члена, например, или, возможно, сделать все вручную - безопасно, зная, что клиентскому коду не понадобитсяизменить.
Это идеально подходит для ситуаций, когда вы уверены, что в конечном итоге вам понадобится контейнер нестандартного типа, но у вас есть существующий тип контейнера, который в настоящее время в основном соответствует требованиям.И это лучшее среднесрочное решение, чем typedef
, потому что нет риска случайного (или умышленного) использования клиентского кода двумя этими типами взаимозаменяемо.