[C++] Virtual Function
CS/C/C++ 2009. 1. 18. 16:14class Stack { public: class Underflow{}; class Overflow{}; // =0은 상속받은 클래스는 이 함수들을 다시 정의해야함을 의미 virtual void push(char c) = 0; virtual void pop() = 0; } class Array_stack : public Stack { char* p; int max_size; int top; public: Array_stack(int s); ~Array_stack(); void push(char c); char pop(); }; class List_stack : public Stack { list<char> lc; public: List_stack() {} void push(char c) { lc.push_front(c); } char pop(); } char List_stack::pop() { char x = lc.front(); lc.pop_front(); return x; } void f(Stack& s_ref) { s_ref.push('c'); if (s_ref.pop() != 'c') throw Bad_pop(); } void g() { Array_stack as(200); f(as); void h() { List_stack ls; f(ls); }
h()에서 f()가 호출되어졌을 때, List_stack::pop()이 호출되어져야만 한다.
g()에서 f()가 호출되어졌을 때, Array_stack::pop()이 호출되어져야만 한다.
이것을 풀기위해, Stack 객체는 런타임에 호출되어질 수 있는 함수를 가리키는 정보를 가지고 있어야만 한다.
이것을 위한 일반적인 구현 방법은 컴파일러가 virtual function 이름을 function을 가리키는 포인터들의 테이블의 index로 만드는 것이다. 이 테이블은 "a virtual function table" 혹은 간단하게 vtbl이라고 불린다.
virtual functino을 가지고 있는 각 클래스는 자신의 virtual function을 가리킬수 있도록 자신의 vtbl을 가지고 있다.
원문 : C++ Programming Laguage 3rd Edtion.