class IPersistentDataStructure { public: virtual ~IPersistentDataStructure(); virtual IPersistentDataStructure &SetVersion(size_t) = 0; virtual size_t GetVersionCount() const = 0; virtual size_t GetCurrentVersion() const = 0; }; class CAbstractPersistentDataStructure: public IPersistentDataStructure { public: CAbstractPersistentDataStructure(); CAbstractPersistentDataStructure(const CAbstractPersistentDataStructure &); CAbstractPersistentDataStructure &operator=(const CAbstractPersistentDataStructure &); // ... }; template class ISegmentTree { public: virtual ~ISegmentTree(); virtual ISegmentTree &Change(size_t, const T &) = 0; virtual T operator()(size_t, size_t) const = 0; }; template class CSegmentTree: public ISegmentTree { public: template CSegmentTree(InputIterator, InputIterator); CSegmentTree(const CSegmentTree &); // ... }; template class CPersistentSegmentTree: public CAbstractPersistentDataStructure, public ISegmentTree { public: template CPersistentSegmentTree(InputIterator, InputIterator); CPersistentSegmentTree(const CPersistentSegmentTree &); // ... };