有一个父类P和一个子类C,都有一个函数FUNC;在变量类型为P,但赋值为C类创建的实例(VAR O: P; O := C.CREATE;)时,根据父类函数是否加VIRTUAL以及子类函数是否加OVERRIDE,实际调用关系如下表所示:
序号 | P.FUNC | C.FUNC | 实际调用 |
1 | VIRTUAL | OVERRIDE | C.FUNC |
2 | VIRTUAL |
| P.FUNC |
3 |
| OVERRIDE | 编译报错 |
4 |
|
| P.FUNC |
附加说明1:在第2、4种情况下,如果变量类型也为C,则调用C.FUNC;
附加说明2:在第2种情况下,如果P.FUNC为纯虚函数(加了ABSTRACT),则调用会出错;
显然,只有在第一种情况下,才能完整地体现多态,所以一定要用第一种方式。