::SelectObjectとCDC::SelectObjectの違いが分かってないのか?

MDC.SelectObject(&bp)が返すのは
MDCが管理するデバイスコンテキストに直前まで選択されていた
同種のGDIオブジェクト、つまりビットマップを管理するCGdiObjectのアドレス。

CGdiObjectクラスは、Win32 GDIオブジェクト(ビットマップ)への
ハンドルをメンバ変数として所有していて、
ハンドルを使ったAPI呼び出しを、クラスのメンバ関数をとおして
利用できるように設計されてるわけだ。

CBitmap *pbに CGdiObject *のポインタを代入しているけど
このとき、CBitmap*はCGdiObjectから派生したクラスへのポインタなので
自動的に、ポインタの型が変換されて正しく代入される。