CS/C/C++
[C++] Virtual Function
amiz
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.