关于override的问题,我不明白为什么要用override,不用为什么不行?
我在父类里不申明我virtual,然后利用同一个名字也一样可以调用子类里的各个函数实现其功能呀。
我不明白使用override的真正含义,谢谢各位大虾的指点。
还有就是overload的用法了,千万不要说要我看书,谢谢了。

解决方案 »

  1.   

    override用于指示编译器进行指针函数编译处理,overload用于指示编译器对同名函数进行分别编译。
      

  2.   

    可是你问的问题太不清楚啦,不说你看书,又能说什么呢?
    你是不是想问为什么要有这条语句,在程序设计中如何使用吗?
    好象一般是在设计类时,如果有共同的代码可以放在父类中,然后父类就用
    VIRTUAL,子类就可以用OVERRIDE啦。
    不过,后来我觉得还是多用VIRTUAL;ABSTRACT;这种纯虚在大多数情况下更好。
    我觉得真想明白面向对象的意义只有多看书,多做别人的例子,
    再自己多写程序,慢慢就有感觉啦。
      

  3.   

    谢谢各位,但是还是与我想知道的没粘上关系。
    我想知道的是,在什么情况下要用OVERRIDE,用他有什么好处,为什么要用?
    如果基类里面定义了一个virtual函数,我们在他的子类中override的函数于基类中的同名函数是什么关系,是不是继承了基类的同名函数?我想知道的是这些。谢谢了。分会给的,还会加分的
      

  4.   

    子类中override的函数于基类中的同名函数是什么关系,是不是继承了基类的同名函数?我想知道的是这些。谢谢了。分会给的,还会加分的
      

  5.   

    子类中override的函数于基类中的同名函数是覆盖基类中的同名函数的实现。
      

  6.   

    先说overload:用于声明过载过程,即名字相同,而参数的数据类型不同的过程。
    例:
    procedure Print(I:Integer);overload;
    procedure Print(S:String);overload;
    在调用的时候,程序员只需记住Print过程,而不必关心参数的数据类型,Print(3)和Print('3')都会解析到相应的正确实现。    再说override:用于重载方法。只有在某个祖先类中声明的虚方法(virtual)才能进行重载。重载方法可以增强原来的行为,也可以对其进行彻底的改变——前者中可使用inherited再加入自己的代码。>>>>我在父类里不申明我virtual,然后利用同一个名字也一样可以调用子类里的各个函数实现其功能呀——你这只是屏蔽了祖先类的方法而已。
      

  7.   

    这说明你对面向对象语言还不熟悉。
    面向对象的特性中多态的体现就在于虚函数。什么老子不等于儿子,儿子可以等于老子这些,希望你找本书仔细研究。也可能一时半会儿还不清楚,那么去看看Java、C++这样面向对象语言中面向对象的特点交叉学习。
      

  8.   

    TO: sailor76()
    谢谢了,你讲的还是比较详细了。 
    >>>>我在父类里不申明我virtual,然后利用同一个名字也一样可以调用子类里的各个函数实现其功能呀——你这只是屏蔽了祖先类的方法而已。我屏蔽与不屏蔽祖先类的方法有什么关系呢?反正就算我不屏蔽祖先类的方法,但是我override了,祖先类的方法在子类中仍然没有起作用呀——这就是我真正想知道的呀。谢谢了
      

  9.   

    TO:JackyChang(摩托骡拉) 你说:子类中override的函数于基类中的同名函数是覆盖基类中的同名函数的实现。既然这样,我不用override,我在子类中也申明一个于父类中同名的函数,不也一样可以覆盖基类中的同名函数吗?希望各位大虾来讨论一下,分等下可以加的。
      

  10.   

    >>>>我屏蔽与不屏蔽祖先类的方法有什么关系呢?反正就算我不屏蔽祖先类的方法,但是我override了,祖先类的方法在子类中仍然没有起作用呀注意:重载方法可以增强原来的行为,也可以对其进行彻底的改变。当然,如果你想彻底改变的话,可以直接声明而不使用override。但这时编译器会发出警告,可以在子类定义前后加上{$WARNINGS OFF}和{$WARNINGS ON}隐藏该警告;也可以在声明后加上reintroduce指令消除警告。{$WARNINGS OFF}
    TMySubClass=class(TMyClass)
      procedure MyMethod(I:integer);
      ...
      end;
    {$WARNINGS ON}

    procedure MyMethod(I:integer);reintroduce;
      

  11.   

    override的作用是子类重载父类的方法。比如说类B是类A的子类,都有一个方法read(),如果有一类B的对象b,执行b->b(),那么究竟是调用类A的read()还是类B的read()呢?编译器在编译程序时是不知道的,要在运行的时候在根据对象b的类型来确定调用哪个read()。这就是动态编译和静态编译的区别。
    为了实现这个目的需要在父类的方法声明中加入virtual关键字。
      

  12.   

    TO: sailor76(快乐的水手) 注意:重载方法可以增强原来的行为,也可以对其进行彻底的改变。增强原来的行为,也可以进行彻底的改变到的是什么意思,这句话我也知道,但就是没有真正理解他的含义呀。特别是说增强原来的行为到底是什么意思,请详细解析一下。
    谢谢各位了。
      

  13.   

    TO: sailor76(快乐的水手) 
    To:to all注意:重载方法可以增强原来的行为,也可以对其进行彻底的改变。增强原来的行为,也可以进行彻底的改变到的是什么意思,这句话我也知道,但就是没有真正理解他的含义呀。特别是说增强原来的行为到底是什么意思,请详细解析一下。
    谢谢各位了。
      

  14.   

    to dyqinwei() 
    问题你又不告诉我,只要我给分,分我肯定会给你们的拉。:)