Pourquoi utiliser de la classe de base des pointeurs pour les classes dérivées

class base{
    .....
    virtual void function1();
    virtual void function2();
};

class derived::public base{
    int function1();
    int function2();
};

int main()
{
    derived d;
    base *b = &d;
    int k = b->function1() //Why use this instead of the following line?
    int k = d.function1(); //With this, the need for virtual functions is gone, right?

}

Je ne suis pas une fac d'informatique ingénieur et je voudrais savoir ce. Pourquoi utiliser des fonctions virtuelles, si on peut éviter de la classe de base des pointeurs?