[C++] Virtual Function

CS/C/C++ 2009. 1. 18. 16:14
 
class 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.
: