Version 17.03
protected メンバ
「前回、クラスを継承すると、派生クラスの中に基本クラスが入る形になる
って説明しました」
『こんな感じなんだよね』
┌───────────┐
│ CDerivedData │
│ ┌────────┐ │
│ │CData │ │
│ │ │ │
│ │m_iData │ │
│ │Output() │ │
│ └────────┘ │
│ m_iData2 │
│ Output2() │
└───────────┘
『メンバ関数とか受け継ぐんだけど、でも独立してるってことなんだね』
「そういうこと。その証拠に、前回の例では、基本クラスのメンバ変数を
private にすると、派生クラスのメンバ関数からアクセスできませんでし
た」
『そうそう。この図みたいに、基本クラスと派生クラスの間に壁がある感
じ』
「で、今回説明するのは private と public の間、 protected っていう
もの」
『ぷろてくてっど?』
「日本語にすると〈保護されている〉っていう意味になるけど、あまり保護
されてるって考えない方がいいかな……簡単に言うと、 protected メンバ
は以下のような範囲からアクセスできます」
■ protected のアクセス範囲
○以下の箇所からアクセスできます。
・自クラスのメンバ関数
・派生クラスのメンバ関数
○以下の箇所からはアクセスできません。
・派生クラス以外の他クラスのメンバ関数
・通常の関数
『 protected は、private に〈派生クラスからならOK〉が加わった、って
ことなのかな』
「そういうこと。実際に protected を使ってみようか」
// Data.h
// CData クラス。
class CData
{
protected:
// データ格納用メンバ変数。
int m_iData;
};
// CData クラスの派生クラス。
class CDerivedData : public CData
{
public:
// 基本クラスの m_iData に値をセットします。
void SetData( int p_i );
};
// Data.cpp
#include <Windows.h>
#include <stdio.h>
#include "Data.h"
// 基本クラスの m_iData に値をセットします。
void CDerivedData::SetData( int p_i )
{
// 派生クラスなのでアクセスできます。
m_iData = p_i;
}
// Main.cpp
#include <Windows.h>
#include <stdio.h>
#include "Data.h"
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
// CDerivedData クラスを使用します。
CDerivedData cDerivedData;
// 普通の関数なのでアクセスできません。
cDerivedData.m_iData = 100;
// コンパイルエラー:
// error C2248: 'm_iData' : protected メンバ
// (クラス 'CData' で宣言されている)にアクセスできません。
return 0;
}
「前回と同じく、 CData クラスとそのクラスから継承した
CDerivedData クラスです」
┌────────┐
│CData │
├────────┤
│m_iData │
├────────┤
│ │
└────────┘
△
│
┌────────┐
│CDerivedData │
├────────┤
│ │
├────────┤
│SetData() │
└────────┘
「まず、以下のようにして m_iData メンバ変数を protected にしていま
す」
class CData
{
protected:
// データ格納用メンバ変数。
int m_iData;
};
『これで m_iData が protected になるんだね』
「 protected は派生クラスのメンバ関数からはアクセスできるから、
CDerivedData クラスの SetData() メンバ関数からはアクセスできます」
// 基本クラスの m_iData に値をセットします。
void CDerivedData::SetData( int p_i )
{
// 派生クラスなのでアクセスできます。
m_iData = p_i;
}
「でも、普通の関数や、派生クラス以外の他クラスのメンバ関数からは
アクセスできません」
int WINAPI WinMain
( HINSTANCE p_hInstance
, HINSTANCE p_hPrevInstance
, LPSTR p_pchCmdLine
, int p_iCmdShow
)
{
// CDerivedData クラスを使用します。
CDerivedData cDerivedData;
// 普通の関数なのでアクセスできません。
cDerivedData.m_iData = 100;
// コンパイルエラー:
// error C2248: 'm_iData' : protected メンバ
// (クラス 'CData' で宣言されている)にアクセスできません。
return 0;
}
『うわ弾かれとる』
「つまり」
┌──────────────┐
│ CDerivedData │
│ ┌────────┐ │
│ │CData │ │
│ │ │ │
│ │m_iData ○←←←│←← │
│ └────────┘ ↑ │
│ SetData() →→→→→→ │
└──────────────┘
「はいいんだけど、」
┌──────────────┐
│ CDerivedData │
│ ┌────────┐ │
│ │CData │ │
│ │ │ │
│ │m_iData ×←←←│←←← │←← WinMain()
│ └────────┘ │
│ SetData() │
└──────────────┘
「はダメ、ってこと」
/*
Preview Next Story!
*/
『ちゃんと別れてるのは分かったかなー。けど』
「けど?」
『使い分けがわからん!』
「それは次回」
『おー』
「というわけで次回」
< Version 17.04 アクセス修飾子のまとめ >
『につづく!』
「ま、正直当分は protected なんて使わなくていいけどね」
『それ言っていいの……?』