가상 함수 / 동적 바인딩 / 다형성

2020. 6. 11. 21:15프로그래밍/C++

* 가상(Virtual) 함수 : 실행 중에 실체를 찾아서 호출해줘~

자식 클래스의 멤버함수가 언제나 호출됨

부모의 포인터 또는 참조를 사용 중이더라도

 

 

* 동적(dynamic) 바인딩 / 늦은(late) 바인딩

실행 중에 어떤 함수를 호출할지 결정한다

당연히 정적 바인딩보다 느림 (정적 바인딩은 컴파일 중에 어떤 함수를 호출할지 아니까)

 

이를 위해 가상 테이블이 생성됨

모든 가상 멤버함수의 주소를 포함(클래스 마다 하나씩!!!)

개체를 생성할 때(각 오브젝트마다), 해당 클래스의 가상 테이블 주소가 함께 저장됨

 

 

* 가상함수.... 왜 느릴까?

> Speak()이 어디 있지?

>> 가상 테이블이 0x009ED8에 있고 Speak() 은 두 번째 함수니(시작 주소에서 +4바이트) 0x009EDC에 저장된 주소에 있겠군!

>>> 실행 중에 점프! 점프! 점프!

가상 테이블 : 점프 테이블 또는 룩업(lookup) 테이블이라고도 불림

 

 

* 가상 소멸자

소멸자가 가상 함수가 아니면(정적 바인딩 경우) 자식 클래스의 소멸자를 호출 안 할수도 있다 >> 메모리 누수!

모든 소멸자에 언제나 virtual 키워드를 붙일 것

 

Animal* yourCat = new Cat(5, "Mocca");

delete yourCat;  // ~Cat() 호출 안함....

 

부모가 가상함수면 자식도 가상함수 되므로 자식에선 virtual 생략 가능

하지만 자식만 보고 가상 함수 아닐수도 있다고 생각할지도 모르니까 둘 다 써주자

 

 

* (내가 생각하는) 다형성을 4단어로 표현

 

같은 함수 다른 기능(수강생 님들 정답 알려주세요 ㅠㅠ)

 

 

 

출처 : 포큐아카데미 C++ 언매니지드 프로그래밍

'프로그래밍 > C++' 카테고리의 다른 글

추상 클래스 / 인터페이스  (0) 2020.06.12
다중 상속  (0) 2020.06.12
멤버 함수의 메모리 / 정적 바인딩  (0) 2020.06.11
상속 / 생성자 소멸자 호출 순서  (0) 2020.06.11
연산자 오버로딩  (0) 2020.06.10