#유코딩 코딩연습장
#가상함수와 순수 가상함수 본문
1.가상함수(virtual function)
- 파생 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미하며, 가상 함수는 자신을 호출하는 객체의 동적 타입에 따라 실제 호출할 함수가 결정 됨.
(기초 클래스에서 virtual 키워드를 사용해 가상 함수를 선언하면, 파생 클래스에서 재정의된 멤버 함수도 자동으로 가상 함수가 됨.
virtual 멤버함수의원 |
2.동적 바인딩(dynamic binding)
(바인딩(binding) : 함수를 호출할때 어느 불록(해당 함수의 정확한 메모리 위치)에 있는 함수를 실행하라는 의미)
- 대부분의 함수는 컴파일 타임에 고정된 메모리 주소로 변환되지만 가상함수는 프로그램이 실행될 때 객체를 결정, 컴파일 타임에 해당 객체를 특정할 수 없기 때문에 컴파일러가 어떤 함수를 호출해야 하는지 미리 알 수 없음, 때문에 가상 함수의 경우 런 타임에 올바른 함수가 실행될 수 있도록 해야 하는것을 동적 바인딩(dynamic bin ding) 또는 지연 바인딩(late binding)이라고 함.
(가상 함수도 결합하는 타입이 분명할 떄에는 정적 바인딩을 하며 이러한 가상 함수는 기초 클래스 타입의 포인터나 참조를 통하여 호출될 때만 동적 바인딩을 함)
3.가상 함수 테이블(virtual function table, vtbl)
C++ 컴파일러는 각각의 객체마다 가상 함수 테이블을 가리키는 포인터를 저장하기 위한 숨겨진 멤버를 하나씩 추가함.
이처럼 가상 함수를 하나라도 가지는 클래스에 대해서 가상 함수 테이블을 작성하고, 해당 클래스의 객체들을 위해 선언된 가상 함수들의 주소를 저장하고 가상 함수를 호출하면 가상 함수 테이블에 접근하여 필요한 함수의 주소를 찾아 호출하여 함수의 호출 과정이 복잡해져서 메모리와 실행 속도에 부담을 가지게 됨
4.가상 소멸자
C++에서 기초 클래스의 소멸자는 반드시 가상으로 선언해야함. 기초 클래스는 명시적으로 소멸자를 선언할 필요가 없더라도 아무 일도 하지 않는 가상 소멸자를 선언해야함.
- 클래스의 공개(pubilc) 섹션에 선언해야함.
- 가상 함수는 정적(static)일 수 없으며 다른 클래스의 친구(friend) 함수가 될 수도 없음.
- 가상 함수는 실행시간 다형성을 얻기위해 기본 클래스의 포인터 또는 참조를 통해 접근(access)해야 함
- 가상 함수의 프로토타입(반환형과 매개변수)은 기본 클래스와 파생 클래스에서 동일
- 클래스는 가상 소멸자를 가질 수 있지만 가상 생성자를 가질 수 없음.