假定一组形状类(如Circle、Triangle、Rectangle和Square等等)都是从基类Shape派生出来的。在面向对象的程序设计中,我们可能要使每一个这样的类都能够绘制其自身形状。尽管每个类都有它自己的draw函数,但是绘制每种形状的draw函数却是大不相同的。当需要绘制形状时,不管它是什么形状,把它作为基类Shape的对象处理是再好不过了。然后,我们只需要简单地调用基类Shape的函数draw,并让程序动态地确定(即在执行时确定)使用哪个派生类的draw函数。
为了使这种行为可行,我们把基类中的函数draw声明为虚函数。然后在每个派生类中重新定义draw使之能够绘制合适的形状。虚函数的声明方法是在基类的函数原型前加上关键字virtual。
一旦一个函数被声明为虚函数,那么它从该点之后的继承层次结构中都是虚函数。
虽然函数在类层次结构的高层中声明为虚函数会使它在底层隐式地成为虚函数,但有些程序员为了提高程序的清晰性更喜欢在每一层中再明确地声明这些函数。
没有定义虚函数的派生类简单地继承其直接基类的虚函数。
如果在基类中将函数draw声明为virtual,然后用指向派生类对象的基类指针调用该函数,则程序会动态地(即在运行时)选择该派生类的draw函数,这称为动态联编。
重定义的虚函数必须和基类虚函数具有相同的返回类型、参数个数和参数类型。
在派生类中重定义的基类虚函数与基类中的版本具有不相同的返回类型和特点是一种语法错误。
如果用名字和圆点成员选择运算符引用一个特定的对象来调用虚函数,则被调用虚函数是在编译时确定(称为静态联编),也就是为该特定对象的类定义的函数或该类继承来的函数。
重载不使用动态联编,在编译的时候编译器就选出了与函数调用特点匹配的函数定义(可能需要用隐式类型转换来实现匹配),它属于静态联编。