protectedなんだからしょうがないだろ。実体がDerivedじゃないかも
知れないのにDerivedに見せるのはおかしい。

実体がDerivedとわかってるなら、
derived *pd = dynamic_cast<derived *>(pb);

実体がDerivedじゃなくても公開したいなら、Baseに
static int &get_hoge(base *pb) { return pb->hoge; }
でも作るのかなあ。