2011-01-19 4 views
0

인터페이스에서 파생 클래스로 다운 캐스트하려고하지만 가상 DLL이이를 종료합니다.가상 인터페이스 Dtor && Dynamic_Cast

class IFOO 
{ 
public: 
virtual ~IFOO(){}; 

virtual size_t index() PURE; 
}; 

class FOO : public IFOO 
{ 
public: 
FOO() : size(5){}; 
~FOO(){}; 

virtual size_t index(){ return index; }; 

size_t index; 

}; 


int main() { 

IFOO* A = &FOO(); 

FOO* B = dynamic_cast< FOO* >(A); 

return 0; 
} 

왜 이렇게 되나요?

+3

예상되는 동작 및 얻는 동작을 설명하십시오. –

+0

RTTI를 사용할 수 있으므로 런타임 검사가 수행되고 파생 클래스에 대해 캐스트가 수행됩니다. 내 인터페이스에서 가상 dtor를 제거하지 않으면 NULL 포인터가 계속 표시됩니다. –

+0

'PURE' :'= 0'에 대한 매크로입니까? 왜'= 0'을 입력하지 않는가? –

답변

4

당신은 줄에 임시의 주소를 복용

IFOO* A = &FOO(); 

IFOO* A = new FOO(); 

난 당신이 있기 때문에이 경우에, 당신의 인터페이스에서 dtor를 제거하면 코드가 작동 생각해야한다 그것은 호출되지 않을 것이고, 여러분은 정의되지 않은 행동의 영역에 들어갈 수 있습니다. 거기에는 무엇이든 가능한 것이고, 나쁜 코드는 예상대로 작동합니다.

또한 대문자로 클래스 이름을 쓰지 않는 것이 좋습니다. 일반적으로 클래스 이름이 매크로는 아니지만 그럴 수는 없습니다. 또한 매크로 (PURE)를 사용하여 코드를 읽어야하는 사람들의 혼란스러운 95 %를 순수 가상으로 만들어서는 안됩니다.

+0

오오 타이! 왜 dtor를 제거하면 캐스팅이 기능적으로 만들어 집니까? –

+0

잠깐. 나는 그것이 꽤 명백 할 것이라고 생각한다. ... –

+2

@PrettyFlower : 컴파일러가 속임수를 쓰고 있기 때문이다. MSVC를 사용하는 경우 MicroSoft C++ Extensions를 끄고 경고 수준을 최대 4까지 올리고 재 컴파일 할 때 schrapnel이 날아가는 것을보십시오. –

관련 문제