오늘의 코드카타
부대복귀
- 출발점과 도착점을 반대로 생각한 후에 BFS
-> 문제 풀이
오늘의 공부
학습한 강의
- Chapter 5 : 네트워크 관련된 액터의 다양한 속성들
- NetLoadOnClient
- NetUpdateFrequency
- Relevancy
- NetPriority
- NetDormancy
정리 노트
오늘의 CS
가상 함수 vs 순수 가상 함수
- 가상 함수
- 부모 클래스에서 virtual 키워드를 붙여 선언한 함수
- 자식 클래스에서 재정의를 통해 객체의 실제 타입에 따라 호출되는 함수가 결정됨
- 반드시 구현이 되어 있어야 함
- 자식 클래스에서 재정의하지 않아도 그대로 사용 가능
- 순수 가상 함수
- 부모 클래스에서 = 0으로 선언하는 가상 함수
- 함수의 인터페이스만 정의하고 구현은 하지 않는 함수
- 반드시 자식 클래스에서 구현해야 사용 가능
- 순수 가상 함수가 하나라도 있으면, 그 클래스는 추상 클래스(객체 생성 불가)가 됨
- 순수 가상 함수를 구현하지 않았을 때 발생하는 에러
- MSVC -> 컴파일 에러 - 순수 가상 함수를 그대로 상속받아서 추상 클래스를 인스턴스화한다고 에러가 발생함
- gcc -> 런타임 에러 - pure virtual function call
- virtual 키워드 내부 동작 과정
- 클래스에
virtual 함수가 있으면 컴파일러는 클래스마다 vtable을 만듬
- 객체가 생성될 때, 각 객체 내부에는 vptr이 생기고 자기 클래스의 vtable을 가리키게 됨
- 가상 함수 호출 시 vptr을 통해 vtable에서 해당 함수를 찾아서 호출
- 소멸자에 virtual를 붙이지 않는 경우
- 컴파일러는 정적 타입 기준으로 소멸자를 호출하기 때문에, 만약에 상속을 받아서 사용할 경우에 자식 클래스의 소멸자가 호출되지 않음
- 따라서 자식 클래스가 동적 할당한 리소스 해제가 누락 -> 메모리 누수 발생
캐스팅 과정
- RTTI가 동작하는 방식
virtual 키워드가 붙은 클래스는 컴파일러가 vtable(가상 함수 테이블)을 만듬
- RTTI를 활성화하면, vtable 앞쪽 메모리에 타입 정보 객체(type_info)를 넣음
- 이
type_info에는 클래스 이름, 상속 관계 정보 등이 들어있음
- 런타임에 vtable을 따라가서
type_info를 참조해서 객체의 실제 타입을 판별함
- dynamic_cast 동작 과정
dynamic_cast는 vtable에서 type_info를 확인함
- 실제 객체의 타입이 자식 클래스인지 비교
- 맞으면 변환 성공 -> 유효한 포인터 반환
- 틀리면 포인터일 때는 nullptr 반환 , 레퍼런스일 때는 bad_cast 예외 발생