Hi Nicholas,
First of all, Rhino supports several types of surfaces:
ON_NurbsSurface
ON_PlaneSurface
ON_RevSurface
ON_SumSurface
ON_Extrusion
You find ON_NurbsSurface, ON_PlaneSurface, ON_RevSurface, and ON_SumSurface in an ON_Brep (ON_Brep::m_S).
All surface types can be represented as NURBS surfaces. To do so, use ON_Surface::GetNurbForm.
ON_Extrusion objects are more like ON_Brep objects then they are surfaces. You can the Brep form of an ON_Extrusion object using `ON_Extrusion::BrepForm```.
What you see in viewports are Breps, not surfaces. The term Brep, or boundary representation, indicates that there are portions of underlying surfaces that you may not see due to trimming. So what you are really seeing in a viewport is a Brep’s Faces (ON_BrepFace), not the underlying surface.
If you are not familiar with Breps, then you might spend some time reviewing the Brep Data Structure that @menno referenced. The openNURBS headers are also a wealth of information. For Breps, see opennurbs_brep.h.
You might review this thread: