首页 > 代码库 > 虚方法与抽象方法的区别

虚方法与抽象方法的区别

抽象方法

使用abstract关键字 public abstract bool Withdraw(…),没有方法体。

抽象方法必须被派生类重写。

任何类中,若存在抽象方法,这个类必须定义为抽象类(不过,里面可以不包含抽象方法)。

===============================================================================

 

虚方法

使用virtual关键字 public virtual bool Withdraw(){....}(有自己的方法体);

是否重写——>随便你。

 

虚方法有自己的方法体,可在子类中重写。重写用new关键字(放在返回类型前面),重写后调用的是新的类成员。

虚方法重写后若要调用基类成员,需强转为基类实例。

 

例如:

 

DerivedClass B = new DerivedClass();
B.DoWork();    // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();     // Calls the old method.

 

 虚函数的限制:

1.虚方法仅适用于有继承关系的类对象。

2.析构函数可以是虚函数。

3.简单点说,抽象方法是需要子类去实现的;  虚方法,是已经实现了,子类可以去改写,也可以不改写取决于需求。


C#中的虚方法使用virtual关键字定义

public virtual void eat();

override关键字作用是对父类的virtual方法进行改写

public override void eat();

 

 

 

虚方法,抽象方法 很多时候都用在 多态 这里!!

 

对于多态:

就是说 父类定义的 虚方法 ,如果有子类改写,那么 其不同子类的对象 优先调用各自的 改写方法,如果没改写,就调用父类的

 

打个比方:

父亲有一家公司,有良好的运营模式。

两个儿子 A B 分别开办了两个子公司。

A 儿子的公司,没有自己的 运营模式 ,于是在公司运营的时候,就使用自己父亲的公司的 运营模式。

B 儿子的公司,是一个 夜总会,父亲的 运营模式 就不适合了,B就改写了 一个新的 运营模式,那么就优先使用自己的 运营模式。

 

至于抽象方法,那就好比:父亲知道公司必须要有一个 运营模式。但父亲却没有自己的公司。于是,父亲寄希望于儿子,儿子们的公司,都必须实现 当初父亲构想的 运营模式。

虚方法与抽象方法的区别