次の基本クラスについて考えてみます。これは、CallDerivedFunctionを呼び出した回数をカウントします。
class B {
public:
B() {numCalls = 0;}
void CallDerivedFunction() {numCalls++; DerivedFunction();}
int GetNumCalls() {return numCalls;}
private:
virtual void DerivedFunction() = 0;
int numCalls;
};
私以外の人は、DerivedFunctionを実装する派生クラスを作成します。ただし、DerivedFunctionが呼び出される回数をカウントしようとしています。
派生クラスDがDerivedFunctionの独自の実装を直接呼び出すのを防ぐ方法はありますか?禁止:
class D : public B {
private:
void DerivedFunction() {
if(<some condition>) DerivedFunction(); // I don't want to allow this.
if(<some condition>) CallDerivedFunction(); // This is OK.
}
};
注:もちろん、これは単純化したものです。より一般的な質問は、基本クラスがマネージャーとして機能し、派生クラスのコレクションの使用パターンの追跡などを行うことになっている場合、派生クラスにマネージャークラスを介して呼び出すように強制できますか?それとも、ここで正しいことをするために派生クラスの開発者に頼らなければなりませんか?