You can type cast object in C++. The typecasted object will have only the members that are shared between the 2, so it will be typecast as the "lesser" of the 2.
I do this in my current game. I have 3 similar objects (they're all actually derived from a single base class, but for simplicity here we'll treat them as wholly unique; still works the same).
Object 1 - CTrooper
Object 2 - CBot
Object 3 - CWall
All 3 classes have these members in common:
void Clip(RECT rcViewable);
void Blt(LPDIRECTDRAWSURFACE7 sfDest);
CTrooper adds a bunch of variables and functions to allow for adjust health, speed, firing accuracy, courage, getting input, etc.
CBot adds a bunch of variables and functions to allow for determining how "smart" it is, get firing accuracy, determining actions base on AI, etc.
//some examples of CTrooper's unique members
void AdjustCourage(int iAdjust);
int GetInput(long lBtn, long lLastBtn, POINT ptMouse);
CWall only has a few additional items like wall "health" etc (the game will allow for misplaced shots to damage terrain, etc.
//a few examples
int GetAction(int iIncomingCommands);
I have an array of pointers to the lowest level object, in this case CWall. So, if I have a total of 3 of these objects in the game (that would be one of each) then I have an array of 3 CWall pointers.
In my blitting code I first copy the addresses of each of my original objects into the array of CWall pointers.
Then I loop through the array of CWall pointers and sort them based on their ptBlt.y value (the higher up the screen they are the sooner they should be blitted, so they don't cover up someone/thing who's in front of them), and then run the Blit routine.
Here's a more simple, generic example using structs (same principles apply):
cout<<pnm2->i<<endl; //would output 10
cout<<pnm2->l<<endl; //would output 3600001