다음 샘플 코드를 고려하십시오. 라인 1에서 static_cast 연산자를 사용한 안전하지 않은 캐스트가 왜 충돌하지 않습니까?
#include <iostream>
using namespace std;
class base
{
public:
void func()
{
cout << "base::func()" << endl;
}
};
class derived : public base
{
public:
void func()
{
cout << "derived::func()" << endl;
}
};
void dummy(base *bptr)
{
derived *dptr = static_cast<derived*> (bptr);
dptr->func();
}
int main()
{
base bob1;
derived dob1;
dummy(&dob1); //Line1
dummy(&bob1); //Line2
}
는 I베이스 클래스 객체에 대한 포인터를 얻어 함수
dummy
에 파생 클래스 객체의 주소를 전달하고있다. 따라서 이
dummy
인 것은 안전합니다.
Line2에서 기본 클래스 개체의 주소를 전달하려고합니다. 따라서 이 dummy
인 함수는 안전하지 않습니다.
그러나 코드를 실행하면 프로그램이 정상적으로 작동합니다. 나는 단어 not safe
에 의해 프로그램이 런타임에 충돌해야한다고 생각했다. 그러나 충돌은 발생하지 않았습니다.
다음은 내가 얻는 결과입니다.
derived::func()
derived::func()
런타임에 프로그램이 중단되지 않은 이유는 무엇입니까?
나쁜 코드는 좋은 코드보다 훨씬 이해하기 어렵습니다. –
@ David : 자세히 설명해 주시겠습니까? –
가능한 중복 http://stackoverflow.com/questions/2469013/should-static-castderived-base-pointer-give-compile-time-error – celavek