protectedアクセス指定子は、派生クラスからのメンバへのアクセスを許可するもの・・・。
そして、クラス継承時にprotectedを付けたprotected継承をすると、publicメンバはprotectedになり、外部からのアクセスができなくなる・・・。
protected.hでは、class_protectedはこのようにclass_baseのprotected継承・・・。
protected.cppのprint_baseは、前回のpublic.cppのprint_baseと変わらず・・・。
// ヘッダのインクルード // 既定のヘッダ #include <iostream> // C++標準入出力 // 独自のヘッダ #include "base.h" // クラスclass_base #include "protected.h" // クラスclass_protected // main関数の定義 int main(){ // オブジェクトの宣言 class_protected p; // class_protectedオブジェクトp // print_baseで出力. p.print_base(); // p.print_baseでメンバを出力. // protected継承だと, publicだったメンバもprotectedになるのでアクセス不可. p.public_variable_ = 1; // 基底クラスではpublicなのでアクセス可だったが, protectedになりアクセス不可. std::cout << "p.public_variable_ = " << p.public_variable_ << std::endl; // 基底クラスではpublicなのでアクセス可だったが, protectedになりアクセス不可. p.public_function(); // 基底クラスではpublicなのでアクセス可だったが, protectedになりアクセス不可. // プログラムの終了 return 0; }
これでコンパイルすると、
$ vi main.cpp $ g++ -o main main.cpp base.cpp protected.cpp In file included from main.cpp:5:0: base.h: 関数 ‘int main()’ 内: base.h:33:9: エラー: ‘int class_base::public_variable_’ はアクセス出来ません int public_variable_; // public変数 ^ main.cpp:18:5: エラー: within this context p.public_variable_ = 1; // 基底クラスではpublicなのでアクセス可だったが, protectedになりアクセス不可. ^ In file included from main.cpp:5:0: base.h:33:9: エラー: ‘int class_base::public_variable_’ はアクセス出来ません int public_variable_; // public変数 ^ main.cpp:19:45: エラー: within this context std::cout << "p.public_variable_ = " << p.public_variable_ << std::endl; // 基底クラスではpublicなのでアクセス可だったが, protectedになりアクセス不可. ^ In file included from main.cpp:5:0: base.h:36:10: エラー: ‘void class_base::public_function()’ はアクセス出来ません void public_function(); // public関数 ^ main.cpp:20:21: エラー: within this context p.public_function(); // 基底クラスではpublicなのでアクセス可だったが, protectedになりアクセス不可. ^ main.cpp:20:21: エラー: ‘class_base’ is not an accessible base of ‘class_protected’ $
アクセス出来ませんと出る・・・。
本来publicだったメンバがprotected継承でprotectedになったからである・・・。
なので、コメントアウト・・・。
$ vi main.cpp $ g++ -o main main.cpp base.cpp protected.cpp $ ./main protected_variable_ = 1 protected_function public_variable_ = 1 public_function $
まあ、前回と変わらない・・・。
派生クラスのメンバのprint_baseからはアクセスできる・・・。
Sample/cpp/protected/protected/src/protected at master · bg1bgst333/Sample · GitHub