c++ factory pattern