有一个父类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),则调用会出错;
显然,只有在第一种情况下,才能完整地体现多态,所以一定要用第一种方式。