The destructor has to be virtual:
Code:
virtual ~CValue() {
    next->prev = prev;
    prev->next = next;
    numVals--;
    if(!numVals)
        first = last = prev = next = NULL;
    delete value;
}