dynamic和virtual的不同之处

时间:2010-01-27 09:04:29  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:中有没有重载基类中的方法,都不会改变VMT的大小,这样VMT中很多位置实际上是重复的,在一个比较大的类库中,势必要浪费不少内存。dynamic的实现方法有所不同,它不是通过VMT中指向实际方法的指针,而是通过索引来实现的,这样只有派生类中重载了的方法才会占据实际的表项,从而节省了内存。dynamic的不利之处在于,由于dynamic的方法表格(相对于VMT,dynamic的方法表格可以称为DMT)在...
  正文:

dynamic和virtual不仅作用相同,声明的语法也相同。它们唯一不同的在于内部机制。virtual的实现是通过虚拟方法表(VMT,virtual method table,和C++中的vtbl很相似)实现的,在类中每一个虚拟函数在VMT中都要占用一个位置。VMT的一个不利之处在于,不论派生类中有没有重载基类中的方法,都不会改变VMT的大小,这样VMT中很多位置实际上是重复的,在一个比较大的类库中,势必要浪费不少内存。dynamic的实现方法有所不同,它不是通过VMT中指向实际方法的指针,而是通过索引来实现的,这样只有派生类中重载了的方法才会占据实际的表项,从而节省了内存。dynamic的不利之处在于,由于dynamic的方法表格(相对于VMT,dynamic的方法表格可以称为DMT)在基类和派生类中的大小不一定相同,同一个dynamic method的表项位置也不一定相同,所以dynamic方法必须动态查找,调用效率就低一些。相比而言,在基类和派生类中的virtual method在VMT中的表项位置总是固定的,所以调用很快。

  总之,dynamic的优点就是virtual的缺点,dynamic的缺点也就是virtual的优点。你可以按照自己的需要来决定究竟用virtual还是用dynamic。不过,dynamic和virtual的区别可能对于编写application framework的程序员或者对那些效率问题至关重要的程序来讲才比较重要,对于一般的应用,虚拟方法不会很多,程序规模也不是很大的情况,一般用virtual就够了。

  Object Pascal也支持abstract method,只要在函数声明中加上abstract关键字即可。当然了,只有virtual或者dynamic方法才能够声明为 abstract。只是和C++中不同,你可以建立abstract class的实例,并且调用它的abstract方法:



type
TTest=class
proceudre f:virtual;abstract;
end;
procedure TForm1.FormCreate(Sender:TObject);
var
t: TTest;
begin
  t := TTest.Create;
  t.f;
  t.Free;
end;

  尽管你会得到一个编译器警告Constructing instance of 'XXXX' containing abstract method 'XXXX.XX',但是程序仍然可以运行,只是当调用t.f的时候会产生一个运行时刻异常。不知道Object Pascal为什么这样安排,在C++中,构造一个含有抽象方法的对象无论如何都不会成功的。Object Pascal为什么要这样处理呢?我不知道。

你可能没有注意到一个关于abstract的小问题:下面的代码会有问题吗?


type
TTest=class
procedure f;virtual;abstract;
end;

TTest2=class(TTest)
procedure f;override;
end;

implementation

procedure TTest2.f;
begin
  inherited;
  ShowMessage(‘Test2.f!’);
end;

procedure TForm1.FormCreate(Sender:TObject);
var
t : TTest2;
begin
  t := TTest2.Create;
  t.f;
  t.Free;
end;

  在Delphi 5中,上面的代码会产生一个Abstract异常。关键在于inherited调用了基类的abstract方法。而在Delphi6中,编译器能够自动识别这种情况,从而不会导致问题。显然,Delphi 6中的这种增强更有利于OO的封装特性,你可以放心大胆的使用inherited,而不用担心基类的方法是否abstract。


"dynamic和virtual的不同之处"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/2010-01-27/12464.html


关键字:

关于《dynamic和virtual的不同之处》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td