There does seem to be some confusion here between the AcDb* and AcGe* namespaces. The two frameworks are different, but they use a lot of the same or similar names ("explode", "isKindOf", etc).
In the AcGe world, we have type AcGeVoidPointerArray, while in the AcDb world, we have AcDbVoidPtrArray. Both types are defined as AcArray<void *>, so they can be used interchangeably, but using the right identifier makes the code a little more readable.
AcGeCurve2d::explode() populates an AcGeVoidPointerArray, where each array entry actually points to an AcGeEntity2d. Likewise, AcGeCurve3d::explode() populates an array with ptrs to AcGeEntity3d's. AcDbEntity::explode(), otoh, gives you an AcDbVoidPtrArray containing pointers to AcDbEntity's.
The original question says that aBloc is a pointer to a BlockReference, so we must be talking about an AcDbBlockReference (since the AcGe* namespace doesn't have block references). Thus it is calling AcDbEntity::explode(), and the solution provided above is correct about using AcDbArc::isKindOf() etc to determine the type of AcDbEntity being pointed to.
Fwiw, the AcRx cast() method might be useful besides isKindOf(). E.g.:
AcDbArc *pArc = AcDbArc::cast(pEnt);
if (pArc != nullptr) {
// do stuff with pArc
}
else if (AcDbLine *pLine = AcDbLine::cast(pEnt)) {
// do stuff with pLine
}
etc
And about "axis points", I'm not sure what the question is. Can you clarify?