Załóżmy taki scenariusz w 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;
};
Teoretycznie wynik tej małej aplikacji powinien wyglądać następująco:
- Podstawa: wyświetlacz niewirtualny.
- Podstawa: wirtualny wyświetlacz.
- Podstawa: wyświetlacz niewirtualny.
- Pochodny: wyświetlacz wirtualny.
ponieważ metoda Display klasy Base nie jest metodą wirtualną, więc klasa pochodna nie powinna mieć możliwości jej przesłonięcia. Dobrze?
Problem w tym, że kiedy uruchamiam aplikację, wypisuje to:
- Podstawa: wyświetlacz niewirtualny.
- Podstawa: wirtualny wyświetlacz.
- Pochodny: wyświetlacz niewirtualny.
- Pochodny: wyświetlacz wirtualny.
Więc albo nie rozumiałem pojęcia metod wirtualnych, albo coś dziwnego dzieje się w Visual C ++.
Czy ktoś mógłby mi pomóc w wyjaśnieniu?
de.Base::Display()
.