非仮想インターフェイスのイディオムは、仮想メソッドが非パブリック カスタマイズ ポイントであり、パブリック メソッドが非仮想であり、基本クラスがカスタマイズ ポイントの呼び出し方法を常に制御できるようにする方法を説明します。
これはエレガントなイディオムであり、私はそれを使用するのが好きですが、派生クラスがそれ自体が基底クラスである場合、どのように機能しますか?
非仮想インターフェイスのイディオムは、仮想メソッドが非パブリック カスタマイズ ポイントであり、パブリック メソッドが非仮想であり、基本クラスがカスタマイズ ポイントの呼び出し方法を常に制御できるようにする方法を説明します。
これはエレガントなイディオムであり、私はそれを使用するのが好きですが、派生クラスがそれ自体が基底クラスである場合、どのように機能しますか?
基本クラス関数がその基本クラス関数をオーバーライドする場合でも、派生クラスは基本クラスのプライベート仮想関数をオーバーライドできるため、機能します。
これは完全に合法です:
class Parent
{
public:
int foo() {return bar();} // the non-virtual public interface
private
virtual int bar();
};
class Child : public Parent
{
private:
virtual int bar(); // overrides Parent::bar()
};
class Grandchild : public Child
{
private:
virtual int bar(); // overrides Child::bar();
};
派生クラスは、それ自体で決定できます。
仮想関数を実装することで、メソッドを完全にオーバーライドできます。派生クラス メソッドのある時点で「中間」クラス関数を呼び出すことにより、メソッドを拡張できます。
それが望ましくない場合は、「中間」クラスで明示的に設定する必要があります。私はしません。これを望んでいる場合は、基本クラスに十分なカスタマイズ ポイントを与えていない可能性があります。