załóżmy ten scenariusz w Visual C++ 2010:Zastępowanie metody non-wirtualne
#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 wyjście z tej małej aplikacji powinno być:
- fundamentowe: Non-wirtualny wyświetlacz.
- Podstawa: wirtualny wyświetlacz.
- Podstawa: Wyświetlanie inne niż wirtualne.
- Wyprowadzony: Wyświetlanie wirtualne.
ponieważ metoda wyświetlania klasy Base nie jest metodą wirtualną, więc klasa pochodna nie powinna mieć możliwości jej przesłonięcia. Dobrze?
Problem polega na tym, że po uruchomieniu aplikacji, drukuje to:
- Base: dla wirtualnego monitora.
- Podstawa: wirtualny wyświetlacz.
- Wyprowadzenie: Wyświetlanie inne niż wirtualne.
- Wyprowadzony: Wyświetlanie wirtualne.
Tak więc albo nie rozumiem pojęcia metod wirtualnych, albo coś dziwnego dzieje się w Visual C++.
Czy ktoś może mi pomóc z wyjaśnieniem?
absolutnie masz __Base: Non-virtual display .__ przy zmianie linii na 'de.Base :: Display()'. –