読者です 読者をやめる 読者になる 読者になる

protected

C++

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