让我们在 Visual C++ 2010 中假设这个场景:
#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
的方法Base
类不是一个virtual
方法所以Derived
类不应该能够覆盖它。正确的?
问题是当我运行该应用程序时,它会打印以下内容:
基础:非虚拟显示。
基础:虚拟显示。
派生:非虚拟显示。
派生:虚拟显示。
所以要么我不明白这个概念virtual
方法或 Visual C++ 中发生奇怪的事情。
解释是什么?
是的,你有点误解了。
在这种情况下,派生类上的同名方法将隐藏父方法。您可能会想象,如果不是这种情况,尝试创建与基类非虚拟方法同名的方法应该会引发错误。这是允许的,这不是问题 - 如果您直接调用该方法,就像您所做的那样,它将被调用良好。
但是,由于是非虚拟的,因此不会使用允许多态性的 C++ 方法查找机制。因此,例如,如果您创建了派生类的实例,但通过指向基类的指针调用了“Display”方法,则将调用基类的方法,而对于“vDisplay”,将调用派生方法。
例如,尝试添加这些行:
Base *b = &ba;
b->Display();
b->vDisplay();
b = &de;
b->Display();
b->vDisplay();
...并观察预期的输出:
基础:非虚拟显示。
基础:虚拟显示。
基础:非虚拟显示。
派生:虚拟显示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)