C#中抽象方法与虚方法的区别

一、抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static.

抽象方法如下示:

public abstract class People   //声明一个抽象类

{

public abstract void study();  //抽象方法只能定义在抽象类中。

}

public class Student:People   //继承抽象类

{

public  override void study()     //重写抽象类的抽象方法

{

Console.WriteLine("好好学习,天天向上!");

}

}

public class Program

{

static void Main(string[] args)

{

Student t= new Student();//实例化派生类

People  p= t;   //使用派生类对象实例化抽象类

//以上两句等价于  People p = new Student();//使用派生类对象实例化抽象类;

p.study(); //使用抽象类对象调用抽象类中的抽象方法study

}

}

总结:(1)象方法只能声明在抽象类中,使用关键字abstract

(2)抽象类中的抽象方法必须被子类重写。

【抽象方法没有方法体,子类必须重写方法体!!,因此抽象方法可以看成是一个没有方法体的虚方法】

二、虚方法:使用virtual修饰的方法:

虚方法可以有方法体。具体示例如下:

public class BaseClass         //创建一个基类

{

public virtual string GetName()    //使用virtual关键字创建父类中的虚方法

{

return "父类虚方法体":

}

}

public class SubClass:BaseClass    //子类继承父类

{

public override string GetName();   //子类重写父类虚方法

{

return "重写父类虚方法!";

}

}

以上的示例:父类中的虚方法被派生类重写了。

注意事项:virtual修饰符不能与private、static、abstract、override修饰符同时使用。

ps:override修饰符不能与new 、static、virtual修饰符同时使用,并且重写方法只能用于重写基类中的虚方法。

虚函数的限制:

* 虚函数仅适用于有继承关系的类对象,所以只有类的成员函数才能说明为虚函数;

*静态成员函数、内联函数、构造函数不能是虚函数;

*析构函数可以是虚函数。

三、两者区别:

总结:抽象方法是只有方法名称,没有方法体(也就是没有方法具体实现),子类必须重写父类抽象方法;

虚函数是该方法有方法体,但是子类可以覆盖,也可不覆盖。

(1)虚方法有方法体,抽象方法没有方法体。抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化;

(2)抽象方法只能在抽象类中声明,虚方法不是;

(3)派生类必须重写抽象类中的抽象方法,虚方法则不必要。

原文地址:https://www.cnblogs.com/posts/p/8260166.html

时间: 2024-08-03 03:11:58

C#中抽象方法与虚方法的区别的相关文章

OO 抽象方法与虚方法的区别

 抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现.] 3.被子类继承后,必须重写: 4.使用关键字abstract修饰: 二.虚方法: 1.可以在抽象类和普通类中定义: 2.可以有方法的实现(方法体,即使空的也要声明) 3.被子类继承后,可以重写也也可以不重写: 4.使用关键字virtrual修饰:

C#中抽象方法与虚拟方法的区别

学过C#的人应该都知道抽象方法与虚拟方法,而很多初学者对二者之间的区别并不是很了解.今天本文就来分析一下二者之间的区别.并附上实例加以说明.具体分析如下: 一.主要区别: 对于抽象方法,子类必须实现它 . 对于虚拟方法,子类可以重写也可以不重写 . 因此, 两者约束不同 二.实例代码如下: /* 声明一个抽象类 * 1.抽象类中可以包含变量 * 2.抽象方法中无法声明方法体 */ abstract class AbsClass { string name; public abstract voi

浅谈接口、抽象类、抽象方法和虚方法的区别

C#抽象类和接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大区别的. 首先说一下接口与抽象类的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方

C# 抽象方法和虚方法的区别

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. (1)象方法只能声明在抽象类中,使用关键字abstract (2)抽象类中的抽象方法必须被子类重写. [抽象方法没有方法体,子类必须重写方法体!!,因此抽象方法可以看成是一个没有方法体的虚方法] 二.虚方法:使用virtual修饰的方法: 虚方法可以有方法体. 注意事项:virtual修饰符不能与private.static.abstract.override修饰符同时使用. ps:override

抽象方法和虚方法的区别

1.抽象类关键字 abstract 2.抽象类不能实例化 3.抽象方法没有方法体 4.子类实现抽象方法的快捷键 Ctrl+.+Enter 5.一个类如果继承抽象类,那么重写重写类中的所有方法 7.抽象类不能是静态类和密封类 8.抽象类方法只能存在于抽象类中 9.抽象类中抽象方法只是用来规定子类方法的形式(参数,返回值)约束子类方法的形式

对抽象类和虚方法的区别

抽象类定义:它的作用就是产生子类的同时给于子类一些特定的属性和方法.abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其他类的父类.标记为抽象或包含在抽象类中的成员必须通过从抽象类的子类来实现. 特性:1.抽象类不能被实例化:2.抽象类可以包含抽象方法和抽象访问器:3.不能用sealed修饰符修饰:4.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现. 总结:~抽象方法是隐式的虚方法:~只容许在抽象类中使用抽

C#中virtual(虚方法)的理解以及和abstract(抽象方法)的区别

Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法. 代码如下: namespace VirtualTestApplication{ public class

虚方法的重写与普通方法的隐藏的区别;抽象方法和虚方法有什么区别?

两者都可实现对基类方法的重写 ,虚方法在基类中virtual ,在派生类用override关键字修饰,而普通方法的隐藏在基类不用什么修饰符,而在派生类中用new关键字进行重写 ,我想问,它们同样是方法的重写, c#为什么会有两种方法重写方法,这样设计不是重复了呢, 这怎么理解呢? 不重复,首先如果基类里面的virtual方法被子类继承之后,用override重写之后,那么子类里面就只有一个该方法名的方法了.而另一个普通的,就是在子类里面直接通过new 来新建一个方法那叫重载(多态分为重写和重载)

关于C#中的抽象类、抽象方法和虚方法的探究

2016年的第一篇文章,容我先喷喷新年的情怀,..........,好了,喷的差不多了. 在面向对象中,我们需要对类进行横向和纵向的认识,不同的类有不同特色的成员,同时在不同类的继承中,子类获得父类的成员也是丰富多彩. 先概述: 1.抽象类 抽象类中不是所有的方法都是抽象方法,对于单纯抽象类而言,是限制类的实例化,可以没有抽象方法.甚至没有任何成员也没事.          2.抽象方法             抽象方法的目的是为了让派生类实现其方法,抽象的方法不实现,抽象方法没有方法体,没有大