継承(C++)した基底クラスの機能のうち、一部を派生クラスの利用者から使えないようにすることができる。

using宣言で隠す

基底クラスのpublicメンバを、派生クラス側でprivateprotectedとして再宣言すると、外部からアクセスできなくできる。

class Base
{
public:
    void print()
    {
    }
};
 
class Derived : public Base
{
private:
    using Base::print;
};

この場合、Derivedの外部からprint()は呼べない。
ただし、Derivedのメンバ関数からは利用できる。

deleteで呼び出しを禁止する

派生クラスで同じシグネチャの関数を= deleteすると、その関数呼び出し自体を禁止できる。

class Base
{
public:
    void print()
    {
    }
};
 
class Derived : public Base
{
public:
    void print() = delete;
};

この場合、Derivedに対するprint()の呼び出しはコンパイルエラーになる。

注意

  • 基底クラスの機能を隠したくなる場合、その継承が本当にis-a関係かを見直す価値がある
  • 多くの機能を隠したくなるなら、コンポジション集約のほうが自然なことがある
  • 外部からだけ隠したいならusing、その呼び出し自体を禁止したいなら= deleteが使える

参考