Effective C++読書メモ #33

2015年10月3日土曜日

Item 33: Avoid hiding inherited names
前回: Effective C++読書メモ #32
長くメモを書いていなかったので続き。前回はパブリック継承の話だった。今回は、継承した名前を隠すのは避ける(あるいはその状況とうまく付き合っていく)という話。
継承の問題というよりはスコープの問題。内側のスコープで名前解決に成功した場合は外側での解決は一切おこなわないため、内側と外側で型が違っていようが何も考慮されない。
ローカルスコープでの名前解決、次に外側としてクラス、次に基底クラスを調べたところで解決できたらそれを使うと。なお、ここで見つからない場合はローカル側の所属する名前空間を見て、最後にはグローバル名前空間を見にいく。
このルールはメソッドについても適用されるし、メソッドの場合はシグニチャベースではなくてメソッド名での名前解決がおこなわれるために継承クラスで基底クラスと同名別パラメータのメソッドを作っても基底クラスのメソッドが隠される結果になる。
継承クラス側で基底クラス側と同名の定義をおこなうことで隠れるものを明示的に継承クラス側に見えるようにするためには
using Base::foo;
の構文での取り込みが必要。
public継承の場合はこれでいいけれど、private継承が絡んでくると少々事情が異なる。private継承をおこなったクラス側で特定のオーバーロードのみを継承したい際には、forwarding function(プロキシ的なもの)を書くことになる。
古のコンパイラがusingを正しくサポートしていない際のための回避策としてもforwarding functionの導入は有効と書かれているけれど、さすがにその方面のコンパイラを触る気持ちは無いので見なかったことにする。
テンプレートが絡むと事情が変わるということで、そのへんはまた今度(#43かな)。

0 件のコメント:

コメントを投稿