先日、基本型へのポインターを取得する関数があり、それを派生型にアップキャストしていくつかの追加機能にアクセスする必要があるインスタンスに遭遇しました。しかし、dynamic_cast
失敗しました。私のタイプは間違いなく基本タイプを継承しているため、これは奇妙なことでした。
何が起こっているのかを理解するために、私は次のテストプログラムを作成しました。これは、私が見たものを複製していると思います。
void cast(TestClass *baseType)
{
if (dynamic_cast<Derived *>(baseType))
TRACE("cast was sucessful");
else
TRACE("cast failed");
}
int main(int argc, char *argv[])
{
Derived *test1 = new Derived();
TestClass *test2 = new TestClass();
TestClass test3;
test1->identify(); // prints: this is a Derived class
test2->identify(); // prints: this is a TestClass
cast(test1); // succesful
cast(test2); // fail - expected
// reassign test2 to test1
test2 = test1;
test2->identify(); // prints: this is a Derived class
cast(test2); // succesful
// the interesting part, the test3 object (created on stack), does not cast
// despite that it would seem possible from the cast method.
test3 = *test1;
test3.identify(); // prints: this is a TestClass
cast(&test3); // fails?
return a.exec();
}
これは興味深いことです。なぜなら、私が呼び出したメソッドだけが提示された場合、cast()
渡されたオブジェクトをキャストできると期待できるからです。そうではないことを示しました。オブジェクトが最初に作成された方法によって異なります。紛らわしいのは、値ではなく参照によって再割り当てされたオブジェクトをキャストできる理由です。さらに、static_cast
タイプに互換性があることが保証されている限り、作業を使用しますか?