トップ-> C++入門:6章 継承-> 派生の種類

←前ページへ :  トップへ :  次ページへ→

6. 派生の種類

派生クラスを作る際に、
class Deriv : public Base
と記述しました。このpublicについて説明します。

  publicを記述すると「公開派生」と言います。当然ながらprotectedやprivateな 派生もあります。

  公開派生を使うと、派生クラスでは親クラスのpublicな変数・関数と親クラスの protectedな変数・関数にアクセスでき、親クラスのprivateな変数・関数にはアクセス できませんでした。他のクラスやmainなどで派生クラスのインスタンスを作って、 そのインスタンスを経由した場合は、親クラスのpublicな変数・関数、派生クラスの publicな変数・関数にしかアクセスできませんでした。

// 親クラス
class Base{
public:
    int base_public;
protected:
    int base_protected;
private:
    int base_private;
};

// 子クラス
class Deriv : public Base{
public:
    int deriv_public;
protected:
    int deriv_protected;
private:
    int deriv_private;

public:
    void deriv_func(){
        // 自分のクラスなので当然アクセスできる
        deriv_public    = 10;
        deriv_protected = 10;
        deriv_private   = 10;

        // 親クラスの場合は・・・
        base_public    = 10;    // publicはだれでもOK
        base_protected = 10;    // protectedは派生クラスからならOK
        base_private   = 10;    // privateは派生クラスでもエラー
    }
};

void main(){
    Deriv d;

    // 外部からは・・・
    d.deriv_public    = 10;     // publicはだれでもOK
    d.deriv_protected = 10;     // protectedは外部からはエラー
    d.deriv_private   = 10;     // privateは自分以外エラー

    d.base_public    = 10;      // publicはだれでもOK
    d.base_protected = 10;      // protectedは外部からはエラー
    d.base_private   = 10;      // privateは自分以外エラー
}

これをまとめると以下のようになります。
アクセス元 アクセス対象 可否
派生クラスのメンバー関数 基底クラスのpublic変数
基底クラスのprotected変数
基底クラスのprivate変数


×
派生クラス外 基底クラスのpublic変数
基底クラスのprotected変数
基底クラスのprivate変数

×
×

  では、public派生以外の場合はどうなるでしょうか・・・。protected派生では、 publicなメンバーもprotectedになってしまいます。private派生では、親クラスの全ての メンバーが派生クラスではprivateになってしまいます。

// 子クラス
class Deriv : protected Base{
public:
    int deriv_public;
protected:
    int deriv_protected;
private:
    int deriv_private;

public:
    void deriv_func(){
        // 親クラスの場合は・・・
        base_public    = 10;    // OK
        base_protected = 10;    // OK
        base_private   = 10;    // エラー
    }
};

// さらに子クラス
class D_Deriv : public Deriv{
    void d_deriv_func(){
        base_public    = 10;   // OK
        base_protected = 10;   // OK
        base_private   = 10;   // エラー
    }
};

void main(){
    D_Deriv d;

    d.base_public    = 10;      // エラー
    d.base_protected = 10;      // エラー
    d.base_private   = 10;      // エラー

    d.deriv_public    = 10;     // エラー
    d.deriv_protected = 10;     // エラー
    d.deriv_private   = 10;     // エラー
}
// 子クラス
class Deriv : private Base{
public:
    int deriv_public;
protected:
    int deriv_protected;
private:
    int deriv_private;

public:
    void deriv_func(){
        // 親クラスの場合は・・・
        base_public    = 10;    // OK
        base_protected = 10;    // OK
        base_private   = 10;    // エラー
    }
};

// さらに子クラス
class D_Deriv : public Deriv{
    void d_deriv_func(){
        base_public    = 10;   // エラー
        base_protected = 10;   // エラー
        base_private   = 10;   // エラー
    }
};

void main(){
    D_Deriv d;

    d.base_public    = 10;      // エラー
    d.base_protected = 10;      // エラー
    d.base_private   = 10;      // エラー

    d.deriv_public    = 10;     // エラー
    d.deriv_protected = 10;     // エラー
    d.deriv_private   = 10;     // エラー
}



←前ページへ :  トップへ :  次ページへ→