Substituindo métodos não virtuais

Vamos supor este cenário no Visual C ++ 2010:

#include <iostream>
#include <conio.h>

using namespace std;

class Base
{
public:
    int b;
    void Display()
    {
        cout<<"Base: Non-virtual display."<<endl;
    };
    virtual void vDisplay()
    {
        cout<<"Base: Virtual display."<<endl;
    };
};

class Derived : public Base
{
public:
    int d;
    void Display()
    {
        cout<<"Derived: Non-virtual display."<<endl;
    };
    virtual void vDisplay()
    {
        cout<<"Derived: Virtual display."<<endl;
    };
};

int main()
{
    Base ba;
    Derived de;

    ba.Display();
    ba.vDisplay();
    de.Display();
    de.vDisplay();

    _getch();
    return 0;
};

Teoricamente, a saída desta pequena aplicação deve ser:

Base: exibição não virtual.Base: exibição virtual.Base: exibição não virtual.Derivado: exibição virtual.

porque o método Display da classe Base não é um método virtual, portanto, a classe Derived não deve ser capaz de substituí-lo. Certo?

O problema é que quando eu executo o aplicativo, ele imprime isso:

Base: exibição não virtual.Base: exibição virtual.Derivado: exibição não virtual.Derivado: exibição virtual.

Então ou eu não entendi o conceito de métodos virtuais ou algo estranho acontece no Visual C ++.

Alguém poderia me ajudar com uma explicação?

questionAnswers(3)

yourAnswerToTheQuestion