『C++Primer 4 th』オブジェクト向けプログラミング読書ノート--protectedメンバー

2324 ワード

C++の基礎的な知識を見るのは久しぶりで、いろいろなことを忘れてしまいました.今日は他の場所でC++クラスprotectedについて見たところあまり覚えていません.『C++Primer 4 th』をめくってみると、迷っているところが多くなっていて、本当に能力のスラグなのか、基礎が本当にだめなのか.
---------------------------------------------------------------------------------------------
クラス設計と保護されたメンバーが継承されていない場合、クラスには2つのユーザーしかいません.クラス自体のメンバーとクラスのユーザーです.クラスをprivateとpublicアクセスレベルに分割すると、ユーザー(クラスオブジェクトを含むこのクラスのプログラムを使用する)はpublicインタフェースにのみアクセスでき、クラスメンバーと友元はpublicメンバーにもprivateメンバーにもアクセスできます.継承があり、クラスの3番目のユーザーがいます.クラスから派生して新しいクラスを定義するプログラマー(派生クラス)です.派生クラスのプロバイダは通常(ただし必ずしも)アクセス(一般的にprivateの)ベースクラス実装を必要としません.このアクセスを許可するために実装への一般アクセスを禁止するために、追加のprotectedアクセスラベルを提供します.クラスのprotected部分は一般プログラマーには使用できません.(このクラスを使用するユーザ)はアクセスするが、派生クラスによってアクセスすることができる.クラス自体と友元のみがベースクラスのprivateセクションにアクセスでき、派生クラスはベースクラスのprivateメンバーにアクセスできません.定義クラスがベースクラスとして機能する場合、メンバーをpublicに設計する基準は変わりません.インタフェース関数はpublicであり、データは一般的にpublicではありません.継承されたクラスは、実装されたどの部分がprotectedとして宣言され、どの部分がprivateとして宣言されるかを決定する必要があります.派生クラスへのアクセスを禁止するメンバーはprivateに設定し、派生クラスの実装に必要な操作またはデータを提供するメンバーはprotectedに設定します.すなわち、派生タイプに提供されるインタフェースはprotectedメンバーとpublicメンバーの組合せである.
protectedメンバー
protectedアクセスタグにおけるprivateとpublicの混合と考えられる.
1、privateメンバーのようにprotectedメンバーはクラスのユーザーにアクセスできません.
2.publicメンバーのように、protectedメンバーはそのクラスの派生クラスによってアクセスすることができる.
さらにprotectedにはもう一つの重要な性質がある.
派生クラスは、派生クラスオブジェクトからベースクラスのprotectedメンバーにアクセスできます.派生クラスは、そのベースクラスタイプオブジェクトのprotectedメンバーに特別なアクセス権を持っていません.
コードを付けて理解すると次のようになります(元のコードリンク:http://blog.csdn.net/luoruiyi2008/article/details/7179788) :
#include <iostream>

using std::cout ;
using std::endl ;


class Base
{
public:
	Base(){};
	virtual ~Base(){};
protected:
	int int_pro;
} ;


class A : public Base
{
public:
	A(){};
	A(int da){int_pro = da;} //   (A)        (Base) protected  (int_pro)
	void Print(A &obj){obj.int_pro = 24;} //     (obj)       protected  (int_pro)
	void PrintPro(){cout << "The proteted data is " << int_pro <<endl;} //   (A)        (Base) protected  (int_pro)
	void PrintBasePro(Base &obj){cout << "The protected data is " << obj.int_pro << endl ;} //   (A)       (obj)protected  (int_prot)        ,      ,       。
} ;


int main(void)
{
	A aObj;
	A aObj2(5);
	aObj2.PrintPro();
	aObj.Print(aObj2);
	aObj2.PrintPro();

	return 0 ;
}