假设我们在Visual C++ 2010中有以下情景:
理论上,这个小应用程序的输出应该是:
基类:非虚拟显示。 基类:虚拟显示。 基类:非虚拟显示。 派生类:虚拟显示。
因为基类的Display方法不是虚拟方法,所以派生类不应该能够覆盖它。对吗?
问题是,当我运行这个应用程序时,它打印出来的是:
基类:非虚拟显示。 基类:虚拟显示。 派生类:非虚拟显示。 派生类:虚拟显示。
所以要么我不理解虚拟方法的概念,要么在Visual C++中发生了一些奇怪的事情。
这是什么解释?
#include <iostream>
using namespace std;
struct Base {
void Display() {
cout << "Base: Non-virtual display." << endl;
};
virtual void vDisplay() {
cout << "Base: Virtual display." << endl;
};
};
struct Derived : Base {
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();
};
理论上,这个小应用程序的输出应该是:
基类:非虚拟显示。 基类:虚拟显示。 基类:非虚拟显示。 派生类:虚拟显示。
因为基类的Display方法不是虚拟方法,所以派生类不应该能够覆盖它。对吗?
问题是,当我运行这个应用程序时,它打印出来的是:
基类:非虚拟显示。 基类:虚拟显示。 派生类:非虚拟显示。 派生类:虚拟显示。
所以要么我不理解虚拟方法的概念,要么在Visual C++中发生了一些奇怪的事情。
这是什么解释?
de.Base::Display()
后,您绝对会有一个非虚拟显示基类。 - v.oddou