2013-08-03 5 views
0

가이 코드를 가지고 경고를 제공dynamic_cast는 <B *>이 (가)

#include <iostream> 

class A 
{ 
    virtual void func() {} 
}; 

class B : A 
{ 
    void func() {} 
}; 

int main() 
{ 
    A a; 
    B* b; 

    b = dynamic_cast<B *> (&a); 

    if (b == NULL) 
    { 
    std::cout << "Bad cast" << std::endl; 
    } 
} 
코드는 내가 예상 (캐스트가 실패)하지만 난 이해하지 못하는이 컴파일러 경고를 같이 동작

nullptr.cc:18:28가 : 경고 : 내가 사용하여 객체를 할당 할 경우 '클래스 B *'에서 'A A'의 dynamic_cast는이

[기본적으로 활성화되지] 성공할 결코 "새"가있다 경고가 없습니다. dynamic_cast가 &을 포인터로 인식하지 못하는 이유는 무엇입니까?

+1

아마도 그렇 겠지만 일부 정적 분석은 a가 A 유형이 아니므로 캐스트가 항상 실패한다는 것을 알 수 있습니다. 이러한 분석은 새로운 것을 사용하는 경우에도 동일하게 수행하기에 충분하지 않을 수 있습니다. – Borgleader

+0

그 말이 맞는 것 같아요. 내가 놓친 일부 미묘한 언어가있을 수도 있다는 걱정이있었습니다. –

답변

1

모든 컴파일러는 포인터가 B의 인스턴스를 가리 키지 않는다는 것을 알려주므로 b은 항상 null입니다.

컴파일러는이를 포인터로 인식하고 있습니다. 이는 의심스러운 동작을 표시하여 도움을주기위한 것입니다. 오류가 아니라 경고 여야합니다. &aA에 항상 포인터이며, 결코에 B :

+0

'nullptr.cc:18:28 : warning : ' – Borgleader

3

컴파일러 은 그렇지 않으면

를 컴파일하지만 당신의 코드를 보이지 않아, A에 대한 포인터로 &a 인식 않습니다! A 유형의 오브젝트 (비 포인터, 사용자가 a로 정의한 실제 오브젝트)는 A 유형의 오브젝트가 될 수 없습니다. 나는 그것을 쓸 때 어리석은 소리가 난다. 귀하의 예제에서

, &a는 항상 정의 A하지 B에 대한 포인터 ( A a 정의), 그래서 컴파일러는 당신이 바보 같은 일을하고있어 알려주된다. BTW - 최적화와 함께 이것을 컴파일하면 실제 실행 파일은 캐스트를 시도하지 않으며 심지어 if 문을 평가하지도 않습니다. 아마도 코드를 다음과 같이 번역 할 것입니다 :

A a; 
cout << "Bad cast"<<endl; 

미리 답변을 알고있는 것을 모두 제거하십시오.

+0

예, 코드가별로 의미가 없습니다. 나는 그 경고에 대해서 궁금해했다. –

+0

경고입니다. 컴파일러는 항상 실패 할 것이라는 것을 경고합니다. 그것은 경고입니다. 오류가 아닙니다. 즉, * legal *이며 작동하지만 어쩌면하려고했던 것이 아닙니다. – rabensky

+2

아니, 정확히 내가하고 싶었던. 모서리에 빛을 비춰서 거기에 무엇이 있는지 알아보십시오. –

관련 문제