类的对象引用。
TA类为为基类,类TAA与TAB为TA类的派生类。
在TA中定义了方法 procedure ABC;
在TAA、TAB中也定义了方法procedure ABC;
对象A是由TA类的派生类(TAA、TAB)生成的对象。由于对象A的构造对象的不确定,在引用对象A的方法ABC的时候需要使用构造类的方法ABC。
在开始的时候
1
Type
2 TA = Class (TObject)
3 public
4 procedure ABC;
5 end ;
6
7 TAA = Class (TA)
8 public
9 procedure ABC;
10 end ;
11
12 TAB = Class (TA)
13 public
14 procedure ABC;
15 end ;
16
2 TA = Class (TObject)
3 public
4 procedure ABC;
5 end ;
6
7 TAA = Class (TA)
8 public
9 procedure ABC;
10 end ;
11
12 TAB = Class (TA)
13 public
14 procedure ABC;
15 end ;
16
定义对象A
1
A : TA;
生成对象
A :
=
TAA.Create;
在使用对象A的方法ABC的时候,就直接调用了类TA的方法ABC,由于目的是想调用类TAA的方法。问题出在哪里呢?
由于类中使用了静态的方法 procedure ABC,在是编译的时候Delphi就 定义了 A : TA,也就是以TAA或TAB类生成的A方法 procedure ABC 在这里也将静态的指向TA类的方法procedure ABC。
只有将类TA中的方法声明为 procedure ABC;virtual;
派生类TAA、TAB的声明为 procedure ABC;override;
使用了RTTI的VMT的虚方法表。正常了。