정체불명의 모모
[C++] 가상 함수(virtual function) 와 가상함수테이블(virtual table) 본문
가상 함수(virtual function)
: 가상 함수는 기본 클래스(상속 되지 않은 클래스) 내에서 선언되어 파생 클래스에 의해 재정의 되는 멤버 함수 입니다.
포인터 또는 기본 클래스에 대한 참조(Reference)를 사용하여 파생 클래스의 객체를 참조하면 해당 객체에 대해
가상 함수를 호출 하고 파생 클래스의 함수를 실행할 수 있습니다.
이는 주로 런타임에 함수의 다형성을 구현하는데 사용 됩니다.
가상 함수는 기본 클래스내에 virtual 키워드로 함수를 선언합니다.
가상 함수 선언의 규칙
1. 클래스의 공개(public) 섹션에 선언합니다.
2. 가상 함수는 정적(static)일 수 없으며 다른 클래스의 친구(friend) 함수가 될 수도 없습니다.
3. 가상 함수는 실행시간 다형성을 얻기 위해 기본 클래스의 포인터 또는 참조를 통해 접근(access) 해야 합니다.
4. 가상 함수의 프로토타입(반환형과 매개변수)는 기본 클래스와 파생 클래스에서 동일 합니다.
5. 클래스는 가상 소멸자를 가질 수 있지만 가상 생성자를 가질 수 없습니다.
가상함수 테이블(virtual function table)
: 부모 클래스의 포인터나 레퍼런스가 자식 클래스 객체를 가리킬 때
자식 클래스의 가상 함수 재정의(override)에 의해 호출되는 함수가 달라지는 것
C++은 가상 함수를 처리하기 위해 가상 함수를 갖는 클래스 마다 '가상 함수 테이블(virtual function table)을 생성하는데,
가상 함수 테이블은 가상 함수 포인터를 모아둔 배열 입니다.
예제 코드
위 코드는 override가 없는 B 클래스
_vfptr에 담긴 void* 를 보면 A::Fun() 담겨 있는것을 알 수 있다.
그 이유는 B클래스에 같은 메소드명의 함수가 없기때문에 부모의 것이 들어 있다.
B클래스에 같은 메소드 명을 선언 후 override 키워드를 사용하면 b의 _vfptr 안에 B::Func이 담기는 것을 볼 수 있다.
virtual table은 이런식으로 void 포인터를 담아 오버라이드 함수를 구분하고 판단한다.
'프로그래밍(c++)' 카테고리의 다른 글
[Effective c++] 캐스팅 4종류(종합 정리) (0) | 2021.10.26 |
---|---|
[Effective C++] Const에 대해 알아보자 (0) | 2021.10.26 |
[c++] reinterpret_cast (0) | 2021.09.15 |
[c++ / 리눅스] Condition Variable (0) | 2021.09.15 |
[c언어] Mutex , cond 기본정리 (0) | 2021.09.14 |