class GenericStack
{
protected:
GenericStack():top(0){}
virtual ~GenericStack()
{
while(top)
{
Data *temp = top;
top = top->next;
delete temp;
}
top = 0;
}
void push(void *value)
{
top = new Data(value,top);
}
void* pop()
{
if (top)
return top->val;
}
bool empty()const
{
return top == 0;
}
private:
struct Data
{
void *val;
Data* next;
Data(void *v,Data *ne):val(v),next(ne){}
};
Data *top;
};
template<class T>
class Stack : private GenericStack
{
public:
void push( T *v)
{
GenericStack::push(v);
}
~Stack()
{
}
T* value()
{
return static_cast<T*>(GenericStack::pop());
}
bool empty()const
{
return GenericStack::empty();
}
};
int main()
{
string a1 = "hello",b = "good";
Stack<string> a;
a.push(&a1);
a.push(&b);
cout<<*(a.value());
system("pause");
}