https://3dmpengines.tistory.com/1421
https://gamedevforever.com/19
윤성우, c++ 기초 플러스 , fundamental c++
https://prostars.net/55?category=2732
:
-> 해당 객체로 파생클래스의 멤버에 접근할 수 없다.
: 하향형변환이다.
-> 파생클래스로 기초 클래스를 가리키는 것은 불필요한 형변환이다.
c언어 방식의 캐스팅 사용을 하지말자.
: 런타입 시에 상향, 하향 형변환을 합니다.
기본적으로는 하향 형변환에서는 막고 있다.
상향형변환은 가능하지만 어째서인지 접근은 못하고 있다...
-> 이유 공부좀...
부모클래스에서 virtual 선언으로 다형성을 만들어 줌으로써
하향 형변환이 가능하다.
-> 하지만 이는 문제를 유발한다. 왜냐하면 pCar1은 작은범위의 값을 가리키고 있다가 확장된 파생클래스를 가리키는 것은 맞지 않기 때문.
하지만 부모가 참조, 파생이 실형식인 상태에서는
형변환이 가능하다.
: 상속 관계에 있는 객체를 상향형변환이나 하향형변환해서 사용해야 할때
https://velog.io/@kwt0124/5%EC%9E%A5.-%EA%B5%AC%ED%98%84
27 장 참고
다운캐스팅 할때 nullptr과 bad_cast가 발생한다.
RTTI 특성을 가진다.
하나 이상의 가상함수가 필요하다.
상속 관계에서 안정적인 캐스팅을 가능케한다.
상속관계에서만 사용이 가능하다.
런타임 도중에 형변환이 이루어지므로 속도가 느리다.
형변환이 실패하면 대상이 포인터면 nullptr, 참조자이면 bad_cast 예외를 던짐으로써 안전한 형변환이라고 할 수 있다.
기본적으로는 상향형변환만 가능하지만, 부모클래스에 virtual , 파생클래스에서 오버로딩이 되어 있다면 하향형변환도 가능하다.
런타임 중에 형변환을 하므로, dynamic이라고 부르는 것이다.
올바른 형변환인지 검사를 하기 때문에 형변환하는데 static_cast보다도 시간이 걸린다.
: 이펙티브 194 쪽에 있음.
-> 이펙티브 시리즈로 넘어 가자
: 컴파일 타임에 상향 , 하향 변환을 진행한다.
: 부모 클래스를 이용해 자식 클래스를 참조할 경우
-> 가상함수로 선언되어 있지 않기 때문에 참조형식의 함수가 호출되는 것이다.
: 부모 클래스의 멤버로 할당 후, 형변환하면 변환이 이루어져야 하지 않지만,
형변환을 진행하면서 결과적으로 파생클래스의 멤버 함수를 호출시켰다.
-> static_cast 형변환은 안전하지 못하다는 것을 확인할 수 있다.