unção virtual argumentos padrão comportamento

Eu tenho uma situação estranha sobre o código a seguir. Por favor, ajude-me a esclarecer.

class B
{
       public:
            B();
            virtual void print(int data=10)
            {
                  cout << endl << "B--data=" << data;
            }
};
class D:public B
{
       public:
            D();
            void print(int data=20)
            {
                  cout << endl << "D--data=" << data;
            }
};

int main()
{
     B *bp = new D();
     bp->print();
return 0;
}

Quanto à saída que eu esperava

[ D--data=20 ]

Mas na prática é

[ D--data=10 ]

Por favor ajude. Pode parecer óbvio para você, mas não conheço o mecanismo intern

questionAnswers(6)

yourAnswerToTheQuestion