0

ポリモーフィッククラスがあり、コンパイラの最適化/ GRを使用してオブジェクトを変換したいのですdynamic_cast<B>(A)が、未定義の動作が発生する可能性があるというメッセージが表示されます。static_cast代わりに使用していますが、実行時チェックが行われず、クラスにとって安全ではありません。CStringまた、クラスからスタックオブジェクトを返すことは有効ですか?

CString CKingdomWar::GetTeamName( eUserTeam eTeam )
{
    if( eTeam == ELDAR )
        return CString( "Eldar" );
    else if( eTeam == ELWYN )
        return CString( "Elwyn" );
    else if( eTeam == NORGNAGON )
        return CString( "Norgnagon" );

    return CString( " " );
}
4

1 に答える 1

1

すでにコメントしたように、CStringは値によって返され、問題はありません。

静的/動的キャストに関しては、警告を与える特定のコードを表示する必要があります。dynamic_cast正しく使用する場合(つまり、互換性のある型間でポインターまたは参照を変換する場合) 、通常はこのような警告は表示されません。

が機能する場合dynamic_cast<B>(A)は、AとBの両方が同じ継承ツリー内のオブジェクトへのポインタまたは参照である必要があります。たとえば、次の場合:

class A {
    // ...
};

class B : public A {
    // ...
};

A* inst = new B;

それならdynamic_cast<B*>(inst)大丈夫です。参照についても同じように扱います。タイプBでない場合inst、ポインタバージョンはNULLを返すか、参照バージョンは例外をスローします。

ただし、これを行うことはできません。

A inst;
B nonono = dynamic_cast<B>(inst);
于 2012-08-08T22:56:40.610 に答える