質問です。

ある機能を薄くラップしたAクラスがあり、その機能の一部を制限し、かつ独自の機能を
追加したBクラスを作成したいとします。このときの実装方法として適切なものはどういうものでしょうか?
特に、制限するところで困ってます(´・ω・`)

プラン1.
class B : public A;
問題点:Aの機能をフルに使えてしまう(制限できない)。
Aに仮想関数xがあったとして、それを制限するために継承したとしてもb.A::x()とすれば呼び出し可能。
まぁコーディング規約としてそういう呼び出し方さえ禁止すれば問題ないんだけど。
なによりも、使用する側に回ったときに、Bのすべての機能についてAからどこが改変されたかを
Aの機能とは別に調べないといけない。

プラン2.
class B{A a;}として、使いたい機能はB::x(){a.x();}としてひとつずつ追加していく。
問題点?:has-a関係って何か間違ってるような気が・・・。

プラン3.
class B : private A;で、使いたい機能だけusing A::xする。プラン2よりは自然な気がする。
問題点:特に無いような気がするけど、ホントに今後困らないかよく分からない。
いいところ:usingしたメソッドはAのものであることが保障されてるのでBの使用者はAのメソッドに
関する知識がそのまま安心して使える。


今のところプラン3で実装しているんですが、なんか根本的に違うような気もしてます。
こういうときに定石としてよく使う方法とかパターンってありますか?よろしくお願いします。