header.h
#include <iostream>
using namespace std;
class A
{
    public:
        virtual void display(int i=5) { cout<< "Base::" << i << endl; }
};
class B : public A
{
    public:
        void display(int i=9) { cout<< "Derived::" << i << endl; }
};  
source.h
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
    A * a = new B();
    a->display();
    A* aa = new A();
    aa->display();
    B* bb = new B();
    bb->display();
}  
output
Derived::5
Base::5
Derived::9  
My understanding was default parameter functions were resolved during compile time using function overloading. Virtual functions were then resolved during runtime using function overriding.
But what is happening is a mess.
How does the function resolution actually happen here?
 
     
     
    