感觉上没什么区别,那为什么还要virtual关键字有何用?

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1773/1773517.xml?temp=.2565119
      

  2.   

    怎么说呢,好像静态有个虚拟表,编译的时候就已经确定了每个函数的地址。这里面放着所有静态方法的地址,这样程序调用的时候,直接在这里取地址,调用函数就可以了,速度比较快。而且不能被重载。动态方法,好像编译的时候并不知道每个子类函数的地址,它是根据对象的所属的类动态调用函数,灵活方便,并且提高了速度譬如
    a=class
      f1:static;
      f2:dynatic
    b=class(a)
      f1;
      f2:override;a1:a
    a1:=a.create;
    a1.f1  调用a.f1
    a1.f2  调用a.f2;a1:=b.create
    a1.f1; 调用a.f1
    a2.f2; 调用b.f2因为a1被宣称为a类的对象,所以对于静态函数他只能调用f1,对于动态函数,
    可以动态根据他所属的类来执行。在网吧里,没有资料,写的不是很明白。
      

  3.   

    1、如果基类不知道如何实现某方法(只有派生类知道),而基类的其他方法又必须使用该方法,则把该方法声明为抽象虚方法-- virtual; abstract;(即C++的纯虚函数)。    2、如果基类能够为某方法提供一种默认实现,但派生类可能完全重写这个实现,则将该方法声明为虚方法-- virtual;并实现默认算法。  3、如果基类能够且必须提供某方法的部分的实现,而派生类必须提供另一部份的实现,则将该方法声明为非虚方法,并在基类中为其配套提供一个虚方法或抽象虚方法,以允许由基类本身调用和被派生类覆盖。
      

  4.   

    似乎搂住的概念不是太清楚,在Pascal中,没有任何修饰符号的方法都是静态方法(这和C是不同的),动态方法是后缀为dynamic的方法,virtual为后缀的称为虚拟方法。动态方法和虚拟方法可以统称为虚方法。
    静态方法和虚方法的内部调用机制有很大不同,另外,引入虚方法的目的是在子类中实现对父类功能的扩展,这是通过在子类中覆盖父类的虚方法来进行的。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————