1 概念
多态性是面向对象语言的一个重要性质,虚函数是帮助C++实现多态性的技术。
多态性体现在可以
使用基类的指针调用派生类的同名函数。前提是基类的同名函数是virtual的。
2 例子
例如:
class Tool
{
Public:
Tool() {}
~Tool() {}
virtual use()
{
cout<< "Tool use" <<endl
}
}
class Pen : Public Tool
{
Public:
Pen() {}
~Pen() {}
use()
{
cout<< "Pen use" <<endl
}
}
int MyUse(Tool& tool)
{
tool.use();
return 0;
}
int main()
{
Pen pen;
MyUse(pen);
return 0;
{
Public:
Tool() {}
~Tool() {}
virtual use()
{
cout<< "Tool use" <<endl
}
}
class Pen : Public Tool
{
Public:
Pen() {}
~Pen() {}
use()
{
cout<< "Pen use" <<endl
}
}
int MyUse(Tool& tool)
{
tool.use();
return 0;
}
int main()
{
Pen pen;
MyUse(pen);
return 0;
}
执行结果是“Pen use”,在MyUse中调用的是pen的use(),符合人们的目的;
如果基类Tool的use()不是virtual,则执行结果是“Tool use”,就是说MyUse()中的tool.use()只会调用Tool类的use()。
3 使用VTABLE
编译器是怎么知道调用Pen的use()? 这是编译器做的工作,编译器在每个包含虚函数的类中
建立了虚函数表VTABLE,并且分配了指向这个VTABLE的指针vptr。
编译器通过查找VTABLE,
得到要执行函数的地址(vptr+n),进而执行函数。
这是在运行期间确定函数地址,叫做晚绑定,与之相反的在编译期间就已确定函数地址,则称作早绑定。