単純なクローン パターンを使用していくつかのコードを書いています。派生クラスにそのクローン パターンを強制的にオーバーライドさせながら、基本クラスを使用する機能を保持できるようにしたいと考えています。(そのため、clone メソッドを純粋仮想であると宣言したくありません。)
コンパイラレベルでこの制限を強制する方法はありますか?
単純なクローン パターンを使用していくつかのコードを書いています。派生クラスにそのクローン パターンを強制的にオーバーライドさせながら、基本クラスを使用する機能を保持できるようにしたいと考えています。(そのため、clone メソッドを純粋仮想であると宣言したくありません。)
コンパイラレベルでこの制限を強制する方法はありますか?
残念ながら、これをC++で実現する方法はありません。子クラスで非抽象メソッドを強制的にオーバーライドすることはできません。ただし、C ++では具体的な基本クラスはかなりまれであるはずなので、設計を再検討することをお勧めします。あなたの全体的な目的についてのより多くの情報で、私たちはあなたの正確なニーズに対してより良い答えを提供することができるかもしれません。
C++ に触れてしばらく経ちましたが、ボディを持つ純粋仮想メソッドを使用できることを覚えています。
// in header
class YourBase {
public:
virtual Foo bar() = 0;
};
// in source
Foo YourBase::bar() {
// a default impl
}
YourBase に bar() の使用可能な impl を残しながら、子クラスが bar() をオーバーライドするように強制する必要があります。
残念ながら、クラスが具体的な基本クラスのメソッドをオーバーライドすることをコンパイル時に強制することはできませんがassert
、各clone
関数の実装で、型がその実装が存在するクラスの型であることを単純に行うことができます。
assert( typeid( *this ) == typeid( ThisClass ) );
次に、すべてのクラスのクローン機能を実行するテストを実行します。