外部の 2 つの派生クラス間で特定の属性をコピーする効率的な方法 (ポリモーフィズムを使用) を見つけようとしています。基本クラスから派生した一連のデータ クラスがありますDataClassA
。DataClassA
これらのデータ クラスを、参照を入力および出力パラメーターとして受け取る別のフィルター クラスで操作したいと考えています。フィルタは に共通する必要な操作を実行しますが、DataClassA
クラス固有の属性を入力クラスから出力クラスに伝播したいと考えています。検討:
class DataClassA
{
public:
virtual void copyAttributes( DataClassA& copyFrom );
}
class DataClassB : public DataClassA
{
public:
virtual void copyAttributes( DataClassA& copyFrom );
};
class DataFilter
{
void run( DataClassA& input, DataClassB& output )
{
//do some calculations here
...
//then copy over attributes
output.copyAttributes( input );
}
};
私の問題は明らかにcopyAttributes()
、入力と出力の両方の派生クラスの型を知る必要があることに依存していることです (必ずしも同じである必要はありません)。ただし、フィルターは基本クラスへの参照のみを処理しますDataClassA
。私の反射神経は単純に を導入することですdynamic_cast
が、手を叩かれるリスクがあります (およびその他の悪影響が考えられます)。これを行った場合、親クラスのcopyAttributes
を呼び出した派生クラスごとにメソッドを作成し、それを使用してオブジェクトが同じ型かどうかを確認します。copyAttributes
dynamic_cast
copyFrom
void DataClassB::copyAttributes( DataClassA& copyFrom )
{
//copy attributes from parent class
DataClassA::copyAttributes( copyFrom );
//test if the class being copied from is of type DataClassB
DataClassB* copyPtr = dynamic_cast<DataClassB*>©From;
if( copyPtr != NULL )
{
//copy DataClassB-specific attributes from copyFrom to this
...
}
}
この問題について私が見つけた最も類似した投稿は、ここVirtual functions and polymorphismでした。私の主な質問は次のとおりです。1) 私の提案した dynamic_cast の使用は不適切ですか?; copyAttributes
2)もしそうなら、どうすればこれを別の方法で実装できますか? ビジターデザインパターンの使用についての言及がありましたが、それがどのように見えるかはわかりません.
これは、Visualization Toolkit (VTK) が行うことの単純なバージョンの一種で、さまざまなデータ クラスで動作するフィルターのクラスを使用しているという意味です。興味深いことに、データ型の正しいダウンキャストのために直接比較できるクラスと親クラスの文字列名を含むマクロを含めることで、RTTI を処理します。