LeetCode 284: Peeking Iterator
Passing larger sized data in functions by const &amp;data is a good idea since it does not make a copy. Note that when a parameter is passed by const&amp;, the extra cost dereferencing and fewer opportunities for compile optimizing. You should do this typically when the data is large in size

From your next() function



    int next() {
        int curr_next = next_num;
        num_has_next = Iterator::hasNext();

        if (num_has_next) {
            next_num = Iterator::next();
        }

        return curr_next;
    } ```


What is the use of the if (num_has_next) branch? You are returning a copy of next_num that was copied before any modifications, and since curr_next is not a reference of next_num, any changes to next_num will not effect return curr_next. I think what you might want to do is
int next(){
    next_num = (num_has_next) ? Iterator::next() : NULL;
    return next_num;
} 

ternary operators 
Since @hjpotter92 has mentioned it,  calling next() or peek() on the last element should return NULL.

Have a look at templates in C++ if you want to work with multiple types.