Function pointers cannot be inlined, a member function of an object can be, and the object itself is 0 bytes large if it doesn't contain data or virtual functions. It is therefore more efficient than a function pointer (which you could pass, nothing wrong with it).

MoMad: if you think about it you class hierarchy is a very bad example of OOP. It revolts against any definition of inheritance I've heard or read. Especially the "is a" connection. "A quad IS A triangle"? Doesn't fit. I'd say go with Zs templated version. Derive it from a common base class FACE:

Code:
class BASE_FACE {
public:
  // This is to find out the number of vertices
  virtual unsigned int GetVertexCount() = 0;
};

template<unsigned int nVertices>
class FACE : public BASE_FACE {
public: // for easier use
  VERTEX arV[nVertices];
  virtual unsigned int GetVertexCount() {
    return nVertices;
  };
};

vector<FACE_BASE*> v;

v.push_back(new FACE<3>);
v.push_back(new FACE<10>);
Just be extremly careful with this. The vector doesn't delete objects for you. Before you remove an item from the vector you must ALWAYS first call delete on it (or get a copy of the pointer and call delete later). This include a vector that goes out of scope.

An even better solution is this: only use triangles as faces. No current 3D car accepts other faces anyway as they are not guaranteed to be plane, so why bother having them in the first place?