継承(C++)した基底クラスの機能のうち、一部を派生クラスの利用者から使えないようにすることができる。
using宣言で隠す
基底クラスのpublicメンバを、派生クラス側でprivateやprotectedとして再宣言すると、外部からアクセスできなくできる。
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が使える