まず、これはこれに対するフォローアップの質問です:同様の const メンバー関数と非 const メンバー関数の間でコードの重複を削除するにはどうすればよいですか?
たとえば、純粋な仮想関数を 1 つ提供する抽象クラスがあるとします。
class ICommand
{
public:
virtual ~ICommand() {};
virtual int Execute() = 0;
protected:
ICommand() {};
};//class ICommand
そして、このクラスから継承する別のクラス:
class cCommand : public ICommand
{
public:
cCommand() {};
virtual ~cCommand() {};
virtual int Execute()
{
int retval = 0;
//do something and return appropriate error code
return retval;
}
};//class cCommand
ここで、ICommand 型のオブジェクトへのポインターが必要ですが、次のような const データが必要です。
//using a smart pointer here would be better, but it shows the problem
ICommand const * p = new cCommand();
int retval = p->Execute(); //won't compile
問題は、const オブジェクトで非 const メンバー関数を呼び出すことです。したがって、ポインター p を作成するときに const を削除する必要がある (悪いと思います...) か、ICommand にも const メンバー関数 Execute() を追加する必要があります。ユーザーが2つの関数を実装する必要があるという事実に少し苦労した後(基本クラスに他の純粋仮想関数を追加するとどうなるかは言うまでもありません...)、次の解決策を思いつきました:
class ICommand
{
public:
virtual ~ICommand() {};
virtual int Execute()
{ //Scott Meyers way
return static_cast<const ICommand&>(*this).Execute();
}
virtual int Execute() const = 0;
protected:
ICommand() {};
};//class ICommand
それは非常にうまく機能しているようですが、これが私の問題に対する適切な解決策であるかどうかはわかりません。どちらも、純粋な仮想メンバー関数の const バージョンを常に実装する必要がありますが、非 const バージョンは実装しないため、これはユーザーにとって非常に直感的ではないと思います。
私の実際の質問は、私が考えていなかった可能性のある副作用があるかどうか、またはこれまでに監視した可能性のあるこの問題に対するより良い解決策があるかどうかです.
前もってありがとう、ルネ。