그래서 내가 dynamic_cast는, C - 스타일 캐스트, static_cast의 차이점에 대해을 좀 더 배우려고 노력하고있어 내가 결정 작동 C 스타일 캐스트 및 static_cast 사이의 차이점을 반영해야하는이 예제를 시도해보십시오.메소드 호출
class B
{
public:
void hi() { cout << "hello" << endl; }
};
class D: public B {};
class A {};
int main()
{
A* a = new A();
B* b = (B*)a;
b->hi();
}
그럼이 코드는이 C 스타일 캐스트 매우 잘못 나쁜 캐스트가 전혀 발견되지 않는다는 것을 반영해야한다. 부분적으로 그런 식으로 발생합니다. 나쁜 캐스트는 감지되지 않지만, 프로그램이 b->hi();
에서 충돌하는 대신 화면에 "hello"라는 단어가 인쇄 될 때 놀랐습니다.
이제 왜 이런 일이 발생합니까? 어떤 객체가 인스턴스화 된 B 객체가 없을 때 그러한 메소드를 호출하는 데 사용 되었습니까? 저는 g ++을 사용하여 컴파일하고 있습니다.
이와 같은 관련없는 유형 (C++에서 효과적으로'reinterpret_cast'는 무엇인가)으로 캐스팅하는 것은 정의되지 않은 동작입니다. 이는 구현이 원하는대로 수행 할 수 있음을 의미합니다. – Yuushi
힌트 : 깨진 시계조차도 적절한 시간을 하루에 두 번 보여줍니다. –
C 스타일의 캐스트는 프로그래머가 컴파일러에게 '나에게 B 객체'라고 알려주는 것과 같다. 컴파일러는 동의 할 수 밖에 없습니다. 실행될 때 발생하는 일은 정의되지 않습니다. 이것이 바로 C 스타일의 캐스트가 너무 위험한 이유입니다. –