protectedな継承

http://www.geocities.jp/ky_webid/cpp/language/032.html

前回のprivateな継承に引き続き、今回はprotectedな継承についてです。

考え方は殆ど同じで、スーパークラスのprivate以外のメンバが、サブクラスのインスタンスからはprotectedのように見えるというものです。

#include <iostream>
using namespace std;

class CSuper {
public:
    void Set (int num) { m_num = num; }
    int Get () const { return m_num; }
private:
    int m_num;
};

class CSub : protected CSuper {
public:
    // これらは今まで通りpublicに見えているので大丈夫
    CSub (int num) { Set(num); }
    void output () { cout << Get() << endl; }
};

int main() {
    CSub obj(100);
    
    // obj.Set(200); // これはprotectedに見えてるのでコンパイルエラーになる
    obj.output();
    
    return 0;
}

これぶっちゃけて言えばprivateな継承と何が違うんでしょうか・・・。

インスタンス化されたオブジェクトから見たら、結局privateだろうがprotectedだろうがアクセスできないことに変わりはないので違いが良く分かりません。

ちなみに元記事にもこう書いています。

protectedな継承はどんな場面で使えるかというと、実はよく分かりません。非常に扱いの難しい機能であることは間違いないでしょう。少なくとも今のところ、protectedな継承をうまく使ったプログラムを見たことがありません。

なんじゃそりゃ。

public、privateだけあってprotectedが無いのは一貫性に支障をきたすからとりあえず入れといた、みたいな。