プラン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のメソッドに 関する知識がそのまま安心して使える。
>>C++ Templates: The Complete Guid 規約無視して、変体書式で書いてある事を貴方は どの様にお考えですか。初めてテンプレ学ぶ人には 変換することが難題だと思いますが。ソースは↓ http://www.josuttis.com/tmplbook/ The only gripe I have against this book is a very very minor one: the authors for some inexplicable reason decided to write "T const* p" instead of "const T* p" in function prototypes. Both are correct and both mean the same thing but nobody uses the first convention whose major fault is
that it's too close to "T *const p" - a different thing entirely. Plus the second convention is such an ingrained idiom that fighting it is pure nonsense which makes the book initially hard to read. Example: what does "char const* const& a" mean? (p. 17) On top of that the reader cannot simply substitute one convention for the other, as the 25,000 C++ books already in print are still going to *be* there plus the x billion lines of legacy C++ code is not leaving any decade soon! So one has to keep *both* conventions in mind in order to read the text. It's really not much of a big deal but I wonder: what were they thinking?