I thought i knew pointers but then as i study run time polymorphism/dynamic binding, i've seen a very different use for pointers. Here are my 3 questions, they're all regarding the single line code below:

```
#include <iostream>
class Base {
    public:
    virtual void fun (int x) { std::cout << "base" << std::endl; }
};

class Derived : public Base {
    public:
    void fun (int x) { std::cout << "base" << std::endl; }
};

int main() {

    //--------------------------------------
    //1. Pointer can only hold memory address, 'Derived()' is calling the default constructor it is not a memory address
    //2. What's the point of putting this into heap?
    //3. I thought pointers could only hold memory address of the same datatype/class
    Base* obj = new Derived();
    //--------------------------------------

    obj->fun(5);
    return 0;
}    

```