#pragma twice

KAB-studio > プログラミング > #pragma twice > 358 Version 17.03 protected メンバ

#pragma twice 358 Version 17.03 protected メンバ

前のページへ 表紙・目次へ 次のページへ

 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 なんて使わなくていいけどね
それ言っていいの……?
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。