11.1.4 虚函数的声明和定义

    虚函数的定义很简单,只要在成员函数原型前加一个关键字virtual即可。如果一个基类的成员函数定义为虚函数,那么,其所有派生类中也将保持为虚函数,即便是在派生类中省略了virtual关键字,结果也是一样的。换言之,一个虚函数是属于其所在的类的层次的,不光属于其定义所在类,只不过是其在该类层次结构中的不同类中有不同的形态。一旦一个函数被声明为虚函数,不论其经历多少次派生,都会保持其虚函数的特性,即使在派生类中没有使用virtual关键字,其仍然是虚函数。

    派生类中可根据需要对虚函数进行重定义,重定义的格式有以下要求。

    ❑与基类的虚函数有相同的参数个数。

    ❑其参数的类型与基类的虚函数的对应参数类型相同。

    ❑其返回值要么与基类虚函数相同,要么都返回指针(或引用),并且派生类虚函数所返回的指针(或引用)类型是基类中被替换的虚函数所返回的指针(或引用)类型的子类型(派生类型)。

    一般要求在基类中说明了虚函数后,在派生类说明的虚函数应该与基类中虚函数的参数个数相等,对应参数的类型相同,如果不相同,则将派生类虚函数的参数的类型强制转换为基类中虚函数的参数类型。

    需要特别强调以下几点。

    (1)virtual应用于修饰public或protected成员函数。private成员既无法从外部访问,也无法在派生类中访问,使用virtual修饰private函数尽管编译器不会报错,但没有意义。

    (2)如果派生类中没有对基类中虚函数进行重定义,则它将继承基类中的虚函数。

    (3)友元不能是虚函数,因为友元不是类成员,只有成员才能是虚函数,但可以在友元内调用虚函数来解决问题。反之,虚函数可以是另一个类的友元函数。