虚方法(virtual)和抽象方法(abstract)的区别

简介:
虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?

1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:

// 抽象方法
public   abstract   class  Animal
{
    
public   abstract   void  Sleep();
    
public   abstract   void  Eat();
}

// 虚方法
public   class  Animal
{
    
public   virtual   void  Sleep(){}
    
public   virtual   void  Eat(){}
}

2. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:
public   class  Animal
{
    
public   abstract   void  Sleep();
    
public   abstract   void  Eat();
}

编译器会报错:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'

3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。如:

public   abstract   class  Animal
{
    
public   abstract   void  Sleep();
    
public   abstract   void  Eat();
}

public   class  Cat : Animal
{
    
public   override   void  Sleep()
    {
        Console.WriteLine( 
" Cat is sleeping "  );
    }
    
//  we need implement Animal.Eat() here

}

编译器会报错:Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()',因为我们没有实现抽象类中所有抽象方法。
相关文章
|
7月前
|
C#
C#中抽象方法与虚方法的区别
C#中抽象方法与虚方法的区别
|
9月前
抽象类和接口(Abstract and Interface)精湛细节
抽象类和接口(Abstract and Interface)精湛细节
|
Java 开发者
抽象类(abstract class)和接口(Interface)的区别
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
本章我们继续讲解面向对象三大特性,上一章我们讲解了继承,本章我们讲解多态。从多态的概念一步步讲解,介绍构成多态的必要条件和两个例外。还会顺带讲解一下 C++11 更新的两个和多态有关系的关键字 final 和 override。上一章我们讲解了虚函数,本章会先补充纯虚函数的概念,然后再引入抽象类的概念。本章我们只学习C++多态的基础知识,至于多态的原理(VTBL、决议等)的难度相对较大,我们单独放到下一章去做专门讲解。
202 0
【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
|
C#
C# 虚方法(virtual)案例详解
C# 虚方法(virtual)案例详解
149 3
|
程序员 PHP 开发者
抽象类 Abstract|学习笔记
快速学习抽象类 Abstract
51 0
抽象类 Abstract|学习笔记
|
Java
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
有一个面试四连击的题目:接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
125 0
接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类中是否可以有静态的main方法?
|
测试技术
抽象类abstract的一些思考
最近有个小朋友问我什么是抽象类,他一直搞不懂抽象类,让我通俗的给他讲下。Emmmmmm,我问他:你用抽象类干过哪些事情。他的回答也在意料之中:压根没用过。
880 0