0

X<T>は、クラスをパラメーターとして受け取るテンプレートクラスであり、A複数または仮想継承を伴わずに派生したBクラスであるとします(つまり、との間でキャストするときにポインターの調整は必要ありません)。BAAB

X<A*>からへ、X<B*>またはその逆のキャストをチェーンソーで再解釈するのは安全ですか?もちろん、aX<A*>はノーX<B*>ですが、これらのクラスは常に同じ動作を共有するべきではありませんか?ポインタが使用されるため、メモリレイアウトは同じである必要があります。X<B*>したがって、実際にはであるインスタンスでメソッドを操作させることは問題ないかもしれませんX<A*>

もちろん、これは、たとえばの要素をに挿入できるように、どういうわけか型安全性を台無しにA*X<B*>ますが、これはこの質問の範囲外です。

4

2 に答える 2

1

本当に必要な場合は、このようなものを書くことをお勧めします。

X<A*> a(new B());
X<B*> b( dynamic_cast<B*> ( a.get_pointer() ) );
if(b.get_pointer() != NULL)
{
    ...
}
于 2012-06-05T11:59:30.010 に答える
0

いいえ、できません。B がポリモーフィック クラスの場合、B* を A* にキャストすると、ポインターの値が変わる可能性があります。一般的に言えば、 reinterpret_cast を使用することは決して安全ではありません。それでも必要な場合は、おそらく何か間違ったことを書いている可能性があります (必要な場合もありますが、これはその 1 つではありません)。

ところで、テンプレートはテンプレート パラメーターに特化できるため、X と X は同じ内部構造を持っていない可能性さえあります。

于 2012-08-13T00:52:03.990 に答える