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

虚方法和抽象方法都可以供派生类重写。

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

class Program

{

static void Main(string[] args)

{

C c = new C();

D d = new D();

}

}

abstract class A

{

public virtual void Sleep()

{

}

public virtual void N(); //报错,虚方法必须有实现部分(方法体).

public abstract void M() //报错

{

}

public abstract void Eat();//抽象方法必须没有实现部分(方法体)

}

class C : A

{

public override void Eat()

{

Console.WriteLine("Eat()被实现");

}

public override void M()

{

Console.WriteLine("M()被实现");

}

}

class D : A  //报错,没有实现父类的抽象方法

{

}

2. 抽象方法只能在抽象类中声明;虚方法可以在抽象类中,也可以在非抽象类中。如:

abstract class A

{

public virtual void Sleep()

{

}

public abstract void Eat();

}

class B

{

public virtual void Sleep() //虚方法可以在抽象类中,也可以在非抽象类中

{

}

public abstract void Eat(); //报错,抽象方法不能在非抽象类中

}

3. 抽象方法必须在派生类中重写(1.中class C 与 class D对比),这一点跟接口类似;虚方法可以在派    生类中重写,也可以不重写。虚方法在子类中重写时要加override。如:

class A

{

public virtual void Sleep()

{

}

}

class C : A

{

public override void Sleep()

{

Console.WriteLine("Sleep()被重写");

}

}

class D : A

{

}

时间: 2024-10-14 19:47:57

虚方法(virtual)和抽象方法(abstract)的区别的相关文章

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

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化.如: //抽象方法public abstract class Animal{    public abstract void Sleep();    public abstract void Eat();} //虚方法public class Animal{    public virtual void Sleep(){}

虚方法virtual、抽象方法abstract、接口interface区别

接口.抽象类.抽象方法.虚方法: 这四个名词时非常容易混淆的: 首先说一下接口 与抽象类 的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方法被继承,需要override重写 . 4.接口更像是一种规范,一种约束. 5.一个子类只能继承一个抽象类,但却可以继

虚方法virtual详解

虚方法virtual详解 从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类. 如:飞禽 bird = new 麻雀();那么飞禽就是申明类,麻雀是实例类. 具体的检查的流程如下 1.当调用一个对象的函数时,系统会直接去检

总结下抽象类Abstract和虚方法Virtual(易混点)

1.普通类中可以有普通方法和虚方法,在被继承时,虚方法可以选择重写(override)或者不重写 2.抽象类中可以有普通方法和虚方法和抽象方法,当被继承时 如下 1.普通方法不能被子类重写 2.虚方法可以选择被子类重写(override)也可以不被重写 3.抽象方法必须被子类重写(override) 原文地址:https://www.cnblogs.com/lixipeng/p/11173377.html

【转】C#虚方法virtual详解

转:https://www.cnblogs.com/zhaoshujie/p/10502404.html 在C++.Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外. 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其

继承小试牛刀:虚方法virtual

#include<iostream>using namespace std;class Point{public:    Point(double a=0,double b=0):xx(a),yy(b){}   virtual double x(){return xx;}   virtual double y(){return yy;}private:    double xx,yy;};class t_Point :public Point{public:    t_Point(double

Partial(部分方法,局部方法),virtual(虚方法),abstract(抽象方法)

Partial 部分方法顾明思议是方法的一部分,不完整的,在ide编译时候,会将所有部分方法加载到一起统一编译,如果分部方法没有被实现,编译器就不会.对他们进行编译. 局部类型的限制 (1) 局部类型只适用于类.接口.结构,不支持委托和枚举.(2) 同一个类型的各个部分必须都有修饰符 partial.(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中.(4) 一个类型的各个部分必须被同时编译. 3. 局部类型的注意点 (1) 关键字partial是一个上下文关键字,只有和 cla

虚方法、抽象方法、接口方法

1.virtual方法(虚方法) virtual方法用于在基类中修饰子类,会遇到下面2种情况: 情况1:子类没有重写,则子类调用的是基类的方法. 情况2:子类重写了,则子类调用的重写的方法. 2. abstract方法(抽象方法) 抽象方法只是可以在抽象类中出现,并且没有具体的实现.抽象类必须在派生类中通过override实现.派生类必须全部实现父类的方法,否则派生类也需要定义为抽象类. 3.接口方法 接口方法必须出现在接口中,没有方法的实现,只有方法名称,参数和返回值.派生类必须全部实现父类方

C#中的抽象方法,虚方法,接口之间的对比

1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们.关键字就是 abstract /* * 抽象方法必须写在,抽象类中 * */ public abstract class Animal { public abstract void Sleep(); public a