有这么一段代码:
#include <iostream>
using namespace std;
class Base{
public:
virtual void display(){cout<<"base"<<endl;}
void set(){display();}
};
class Derived:public Base{
public:
void display(){cout<<"derived./n";}
};
int main()
{
Derived d;
d.set();
return 0;
}
如果没有virtual,则结果将会输出:
base
如果加上virtual,则会输出:
derived
原因如下:
如果不是虚拟函数,则在set()函数中查找display()函数地址的时候直接将Base::display()地址写入。而如果是虚拟函数的话,那么编译器将在该地方用vtable[0]来代替。