2 レベル以上の継承に対する非仮想インターフェイスのイディオム?
-
02-07-2019 - |
質問
非仮想インターフェイスのイディオムは、仮想メソッドが非パブリックのカスタマイズ ポイントであること、およびパブリック メソッドが非仮想であることにより、基本クラスがカスタマイズ ポイントの呼び出し方法を常に制御できるようにする方法を説明します。
これはエレガントなイディオムであり、私はこれを使用するのが好きですが、派生クラスがそれ自体が基底クラスである場合はどう機能しますか?
解決
基本クラスの関数が基本クラスの関数をオーバーライドする場合でも、派生クラスは基本クラスのプライベート仮想関数をオーバーライドできるため、これは機能します。
これは完全に合法です:
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();
};
他のヒント
派生クラスはそれ自体で次のことを決定できます。
仮想関数を実装することでメソッドを完全にオーバーライドできます。派生クラス メソッドのある時点で「中間」クラス関数を呼び出すことで、メソッドを拡張できます。
それが望ましくない場合は、「中間」クラスで明示的に設定する必要があります。私はそうしません。これを望んでいる場合は、おそらく基本クラスに十分なカスタマイズ ポイントを与えていないことを意味します。
所属していません StackOverflow