Припустимо, цей сценарій у 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;
};
Теоретично, результат цього маленького додатка повинен бути:
- Основа: невіртуальний дисплей.
- Основа: Віртуальний дисплей.
- Основа: невіртуальний дисплей.
- Виведено: віртуальний дисплей.
оскільки метод Display базового класу не є віртуальним методом, тому похідний клас не повинен мати можливість його замінити. Правда?
Проблема в тому, що коли я запускаю програму, вона друкує це:
- Основа: невіртуальний дисплей.
- Основа: Віртуальний дисплей.
- Похідне: невіртуальний дисплей.
- Виведено: віртуальний дисплей.
Отже, або я не розумів поняття віртуальних методів, або щось дивне відбувається у Visual C ++.
Чи може хтось допомогти мені з поясненням?
de.Base::Display()
.