黑马程序员技术交流社区

标题: 虚方法和抽象类有什么区别? [打印本页]

作者: 李准    时间: 2013-3-15 22:05
标题: 虚方法和抽象类有什么区别?
本帖最后由 李准 于 2013-3-15 23:38 编辑

虚方法和抽象类有什么区别?感觉一样的,做题都能实现的,具体什么时候用哪个呢?谢谢大家!

作者: 边道坚    时间: 2013-3-15 22:13
抽象方法   
   使用abstract关键字    public    abstract    bool    Withdraw(…);   
   抽象方法是必须被派生类覆写的方法。   
   抽象方法是可以看成是没有实现体的虚方法   
   如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法   
   
虚方法   
   使用virtual关键字    public    virtual    bool    Withdraw(…);   
   调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。   
   虚方法可以有实现体

若一个实例方法的声明中含有        virtual        修饰符,则称该方法为虚拟方法;一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。         
            
       虚函数的限制:         
            
       1.虚函数仅适用于有继承的类对象,        所以只有类的成员函数才能说明为虚函数.            
       2.静态成员函数不能是虚函数.            
       3.内联函数不能是虚函数.            
       4构造函数不能是虚函数.            
       5.析构函数可以是虚函数.

简单点说,抽象方法是需要子类去实现的.虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求.   
   如   
   public    abstract    class    AUser   
   {   
           public    abstract    UserInfo    getUser();   
           public    virtual    void    Save(UserInfo    info)   
           {   
                   //实现保存的功能   
           }   
   }   
   
   public    class    UserSqlServer:AUser   
   {   
           public    override    UserInfo    getUser()   
           {   
                     //一定要实现的,抽象类只给了抽象方法   
           }   
           //假设抽象类针对SqlServer实现的功能,这里不需要实现了.   
   }   
   
   public    class    UserOracle:AUser   
   {   
           public    override    UserInfo    getUser()   
           {   
                     //一定要实现的,抽象类只给了抽象方法   
           }   
           //假设抽象类针对Oracle实现的功能   
           public    override    void    Save(UserInfo    info)   
           {   
                     //覆盖抽象类中的Save方法   
           }   
   }   
   以上只是例子,真实并不这么做.  
作者: 李准    时间: 2013-3-15 23:38
谢谢 很详细!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2