[C#基础知识]关于虚函数Virtual 及 抽象函数Abstract

原创 2012年04月07日 09:49:27


Virtual

虚函数是多态的前提和保证

  被标注为virtual的函数可以被继承类重写(override),并且可以在运行时动态调用相应的方法(多态)。

  没有标注为virtual的非虚方法,在继承类中虽然不能通过override重写方法,但是也可以声明一个同名方法的,不过不具备多态的性质!



有两个类如下:

    public class SuperClass
    {
        public void Display()//not virtual
        {
            Console.WriteLine("I'm super");
        }

        public virtual void Vdisplay()
        {
            Console.WriteLine("I'm superVVV!!!");
        }
    }

    public class LowerClass : SuperClass
    {
        public void Display()//new public void Display();和父类中的方法同名,却不具备多态的性质
        {
            Console.WriteLine("i'm lower");
        }
        public override void Vdisplay()//重写了父类中的方法
        {
            Console.WriteLine("I'm lowerVVV");
        }
    }

主函数及输出如下:

        static void Main(string[] args)
        {
            //这里一切正常
            LowerClass l = new LowerClass();
            l.Display(); //输出:I'm lower
            l.Vdisplay();//输出:I'm lowerVVV

            //问题在下面:
            SuperClass s = new LowerClass();
            s.Display(); //输出:I'm super (!!!注意:此处并没有多态的影子,而是直接调用了父类SuperClass的Display()方法)
            s.Vdisplay();//输出:I'm lowerVVV
        }


Abstract

abstract抽象方法则更像是一个接口(Interface)方法

被标注为abstract的方法不能有具体的实现!

而且如果有方法被标注为abstract, 则这个类需要被标注为abstract


具体关于virtual 和 abstract的区别可以参看:http://www.cnblogs.com/MayGarden/archive/2010/04/04/1704279.html


C#抽象类、接口、虚函数和抽象函数

C#抽象类和接口 转载自:http://blog.csdn.net/lwk2011/article/details/5974383 抽象类和接口的异同 一、抽象类:       抽象类...
  • baidu_21132571
  • baidu_21132571
  • 2014年11月08日 15:42
  • 1551

虚函数和抽象函数的区别

虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写   抽象函数是没有代码,子类继承后一定要重写 在一个类中用虚函数:   是因为在超类中的有实际代码的方法,但明确允许...
  • rfb0204421
  • rfb0204421
  • 2008年12月18日 13:20
  • 8818

C#中虚函数跟抽象函数有什么用,怎么去区别

这个问题,你要明白: 1.虚方法其目的就是为了重写,但它可以有自己的实现部分。 2.抽象方法:其名为抽象,很好理解,其不能提供具体的实现,只是一个可重写的(隐性的)虚方法的(可以理解为接口)模版。...
  • lovetaosha
  • lovetaosha
  • 2012年12月01日 10:21
  • 2318

C++ 虚函数、纯虚函数 VS JAVA抽象函数

C++ 虚函数、纯虚函数 VS JAVA抽象函数
  • whjk20
  • whjk20
  • 2016年08月29日 15:02
  • 1000

C#类的方法:重载,从写,虚函数,抽象函数,隐藏基类方法!

1:重载   方法重载的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。       特点:函数名称必须一样,返回类型可以不一样,参数可以不一样。 using System; usin...
  • zhifeiya
  • zhifeiya
  • 2013年05月15日 01:21
  • 1358

简单易懂的解释c#的abstract和virtual的用法和区别

先来看abstract方法,顾名思义,abstract方法就是抽象方法。 1、抽象方法就是没有实现的,必须是形如: public abstract void Init(); 2、拥有抽象方法的类...
  • wzj0808
  • wzj0808
  • 2016年05月12日 22:04
  • 3701

C#中的virtual和abstract

virtual是实现C++多态的关键性条件:C++使用关键字virtual来修饰类中的方法,被修饰的方法可以在子类中重写,如此便覆盖基类方法,以实现相同的行为却不同的功能;多继承情况下的基类析构函数通...
  • iFuMI
  • iFuMI
  • 2016年07月16日 14:43
  • 799

C++、C#中 abstract 与 virtual关键字的区别联系

C++:   C++中,由virtual实现多态。除多态外,virtual有两个特殊用法: 1、虚基类(Virtual base class)       为解决多重继承时的二义性提出来的。使...
  • iefswang
  • iefswang
  • 2012年04月30日 21:01
  • 9678

c# 虚函数Virtual与重写override

C#代码   using System; namespace Smz.Test { class A { ...
  • u010613052
  • u010613052
  • 2016年04月26日 11:45
  • 1638

虚函数、抽象函数、接口的区别。

虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写    抽象函数是没有代码,子类继承后一定要重写 在一个类中用虚函数:    是因为在超类中的有实际代码的方...
  • liu696639
  • liu696639
  • 2017年02月03日 10:24
  • 444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[C#基础知识]关于虚函数Virtual 及 抽象函数Abstract
举报原因:
原因补充:

(最多只允许输入30个字)