アップデート1:
ナンセンスコードを修正しました!コメントありがとうございます。最初のスニペットのハッシュを作成しました。
アップデート2:
dynamic_castの使用は回答によって不要であると指摘されているため、質問のタイトルも更新されました。
ここで達成しようとしているのは、強力な型を使用したディープコピーです。Class2をClass2の別のインスタンスにコピーできるようにしたい。ただし、ベースであるClass1のCopyTo関数も使用したいと思います。このアイデアは、私のC#の経験から生まれたもので、通常はリターンタイプをジェネリックにします(C#スニペットを参照)。
void Class1::CopyTo(Class1 *c1)
{
// Write data in to c1 from this instance.
c1->exampleData = exampleData;
}
// Class2 inherits Class1
Class2 *Class2::Copy()
{
Class2 *c2a = new Class2();
CopyTo(c2a);
Class2 *c2b = dynamic_cast<Class2*>(c2a);
return c2a;
}
そして、これが私がC#でそうする方法です:
public class Class1
{
T Copy<T>()
where T : Class1
{
/* Can't remember the best way to do this in C#;
* basically if T was Class2 this would need to create
* a new instance of that class, and the same goes for
* Class1. */
T copy = createNewInstance();
// Copy the data from this to 'copy'.
copy.exampleData = exampleData;
return copy;
}
}
さて、C#スニペットと比較すると、C++スニペットは臭いを感じます。ポインタなしでこれを行うことは可能ですか、それともこの方法がベストプラクティスですか?