>>350
template < class T > class CMaterial {
  CMaterial* NextMaterial;
public:
  T* CreateNext() { return NextMaterial = new T; }
};
class CBlock : public CMaterial<CBlock> {};

/* または */

class CMaterial {
  CMaterial* NextMaterial;
protected:
  virtual CMaterial* Factory() const { return new CMaterial; }
public:
  CMaterial* CreateNext() { return NextMaterial = Factory(); }
};
class CBlock : public CMaterial<CBlock> {
protected:
  virtual CMaterial* Factory() const { return new CBlock; }
};