派生クラスを定義するときに、基底クラスをpublic / protected / privateのどれで継承するかを指定するもの。

この指定は、基底クラスのメンバが派生クラス側でどのアクセスレベルとして扱われるかに影響する。

基本構文

class Derived : public Base
{
};

publicの部分が、継承に対するアクセス指定子である。

変化のしかた

基底クラスのメンバは、継承方法によって派生クラス側で次のように扱われる。

基底クラスでのアクセスpublic継承protected継承private継承
publicpublicprotectedprivate
protectedprotectedprotectedprivate
privateアクセス不可アクセス不可アクセス不可

基底クラスのprivateメンバは、どの継承方法でも派生クラスから直接アクセスできない。

public継承

基底クラスのpublicメンバは派生クラスでもpublicのままで、protectedメンバもprotectedのままである。

class Base
{
public:
    int m_public{};
 
protected:
    int m_protected{};
};
 
class Derived : public Base
{
public:
    void f()
    {
        m_public = 1;
        m_protected = 2;
    }
};

public継承はis-a関係を表すときに使う最も一般的な継承方法である。

protected継承

基底クラスのpublicメンバとprotectedメンバは、どちらも派生クラスではprotectedとして扱われる。

外部には公開したくないが、さらにその派生クラスからは使えるようにしたい場合に使われることがある。
ただし、実際にはあまり使われない。

private継承

基底クラスのpublicメンバとprotectedメンバは、どちらも派生クラスではprivateとして扱われる。

class Base
{
public:
    int m_public{};
 
protected:
    int m_protected{};
};
 
class Derived : private Base
{
public:
    void f()
    {
        m_public = 1;
        m_protected = 2;
    }
};

この場合、Derivedのメンバ関数からはアクセスできるが、Derivedの外部からは基底クラス由来のメンバへアクセスできない。

private継承は、is-a関係というより、基底クラスを内部実装として利用したい場合に使われることがある。
ただし、これも実際にはあまり使われない。

注意

  • 継承方法を省略すると、クラス(C++)ではprivate継承になり、構造体(C++)ではpublic継承になる。
  • これらの規則は、メンバ変数だけでなくメンバ関数やクラス内で宣言された型にも当てはまる
  • 一般には、特別な理由がない限りpublic継承を使う
  • 基底クラスのメンバは、可能ならprotectedよりprivateを優先する

参考