0

我有多态类,我想通过dynamic_cast<B>(A)编译器优化/GR转换一个对象,我收到一条消息,它可能导致未定义的行为。我正在使用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)就好了。同样处理参考。如果inst不是 B 类型,则指针版本将返回 NULL,否则引用版本将抛出异常。

但是,您不能这样做:

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