티스토리 뷰

| 가상 함수 

객체 지향 프로그래밍에서 가상 함수(virtual function 또는 virtual method)는 상속하는 클래스 내에서 같은 시그니처 함수로 오버 라이딩될 수 있는 함수 또는 메서드이다. 가상 함수에 관련된 내용은 아래 링크를 참조한다.

https://coding-factory.tistory.com/699

| 가상 함수는 'vtable' 혹은 가상 테이블(virtual table)에 의존한다.

어떤 클래스의 함수가 virtual로 선언되어 있으면, 해당 클래스의 가상 함수 주소를 보관하는 vtable이 만들어진다. 컴파일러는 또한 해당 클래스의 vtable을 가리키는 vptr이라는 숨겨진 변수(hidden variable)를 해당 클래스에 추가한다. 하위 클래스가 상위 클래스의 가상 함수를 오버라이드(override) 하지 않으면 하위 클래스의 vtable은 상위 클래스의 가상 함수 주소를 보관한다. 

 

이 vtable을 사용하여 가상함수가 호출될 때 어느 주소에 있는 함수가 호출되어야 하는지 결정한다. C++의 동적 바인딩(dynmaic binding)은 이 가상 테이블 메커니즘을 사용하여 실행한다. 따라서 하위 클래스 객체에 대한 포인터를 상위 클래스 객체에 대한 포인터에 할당하면, vptr 변수는 하위 클래스의 vtable을 가리킨다. 이렇게 배정되므로 최하위 클래스의 가상 함수가 호출되는 것이다. 

 

class Shape { 
public:
	int edge_length;
    virtual int circumference() { 
    	cout << "Circumference of Base Class \n";
        return 0;
    }
};

class Triangle : public Shape { 
public:
	int circumference() { 
    	cout << "Circumference of Triangle Class\n";
        return 3 * edge_length;
    }
};

void main() {
	Shape * x = new Shape();
    x->circumference(); // "Circumference of Base Class"
    Shape * y = new Triangle();
    y->circumference(); // "Circumference of Triangle Class"
}

위의 예제에서 circumfrence는 Shape 클래스의 가상 함수다. 따라서 모든 하위 클래스(Triangle 등)에서도 circumference는 가상 함수가 된다. C++의 비가상 함수에 대한 호출은 컴파일 시간에 정적 바인딩을 통해 처리되지만, 가상 함수에 대한 호출은 동적 바인딩을 통해 처리된다. 

 

reference : ctci 6th book, wikipedia

'IT > C, C++' 카테고리의 다른 글

[C] 함수포인터 기초  (0) 2023.07.16
[C++] 비트단위의 데이터 저장방법  (3) 2022.10.06
[C/C++] Hash Table vs STL map  (0) 2022.09.15
Google C/C++ CodeStyle  (0) 2022.08.12
[C/C++] const 개념 한번에 이해하기  (0) 2022.08.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함