Базовый класс auto_ptr<T>
, из которого вы производите, является контейнером для элемента класса T
. Этот базовый класс имеет (по крайней мере) конструкторы, которые вы вызываете:
Базовый класс можно определить следующим образом (на самом деле это не так, но определения конструктора могут дать вам картину):
template<typename T>
class auto_ptr {
T* value;
public:
auto_ptr() : value(NULL) {}
auto_ptr(T* t) : value(t) { }
auto_ptr(auto_ptr<T>& other) : value(other.value) {}
};
Итак, auto_ptr<T>
содержит значение типа T
. И три определенных конструктора заботятся о:
- пустое / стандартное строительство
- конструкция из необработанного указателя
- копия контейнера
Итак, сообщая классу, вы даете Super
имя std::auto_ptr<T>
, которое является просто сокращением для вызова соответствующего конструктора базового класса. Вы могли бы написать
template<typename T>
class K : public std::auto_ptr<T>
{
public:
K() : std::auto_ptr<T>() { }
K(T* t) : std::auto_ptr<T>(t) { }
K(K<T>& o) : std::auto_ptr<T>(o) { }
};
потому что вы теперь напрямую вызываете конструкторы базового класса. А те, которые мы определили ранее (и в «реальной жизни», определены более разумно, чем я здесь).
PS: auto_ptr<>
приятно, если вы еще не видели unique_ptr<>
. auto_ptr<>
s "плохой парень" - это конструктор копий. Не упустите C ++ 0x ...