http://www.cnblogs.com/denylau/archive/2010/04/11/1709573.html

http://www.cnblogs.com/naariah/archive/2011/07/13/2105255.html

http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html

http://www.cnblogs.com/lykbk/archive/2012/06/01/lyk19900723_daima3.html

http://www.cnblogs.com/qq4004229/archive/2012/10/23/2735477.html

首先在C#中虚方法的定义:

public virtual void VirtualMethod(){......};

只要在方法名前加上virtual,就声明了该方法为虚方法,注意声明为虚方法后再不能加上abstract,static关键字声明

以下是插入一个实例来说明虚方法与非虚方法的不同

public class A
        {
            public virtual void VirMethod()
            {
                Console.WriteLine("Virtual Method A");
            }
            public void NormalMethod()
            {
                Console.WriteLine("Normal Method A");
            }
       
        }
        public class B : A
        {
            public override void VirMethod()
            {

Console.WriteLine("Virtual Method B");
            }
            public new void NormalMethod()
            {
                Console.WriteLine("Normal Method B");
            }
        }

在main函数中执行:

B b = new B();
            A a = b;//将派生类的实例赋给基类的对象

a.VirMethod();
            a.NormalMethod();
            b.VirMethod();
            b.NormalMethod();
            Console.ReadKey();

执行结果:Virtual Method B

Normal Method A

Virtual Method B

Normal Method B

通过结果表示 a.VirMethod() 虚方法是执行了B类的重写的方法;

a.NormalMethod();非虚方法还是执行了A类本身的方法;

A a = b 这步操作是通过派生类的实例来构造基类的对象,基类指针实际上是指向派生类的对象;所以a.VirMethod()这一步调用的是派生类重写了的方法。

而a.NormalMethod() 还是调用基类的方法

(在这里插下:override是重写了基类的虚方法,new 是新创建一个方法,就是与基类同名而已,但还是子类的自已的方法)

override是重载(有的翻译为覆盖),new是隐藏。

再补充一下:A a = b; 其中A是声明类,B是实例类

在调用函数的时候,系统是先去看声明类,如果函数不是虚函数,就直接调用声明类的,如果是虚函数,它会转去检查对象的实例类.(个人觉得挺有道理的)

如果继承是面向对象设计理论的基石,那么抽象理论和方法就是继承理论的顶梁柱。在汉语词典中抽象是这样解释的:将几个有区别的物体的共同特性或形象抽取出来或孤立地进行考虑的行动或过程。可以看出,抽象就是从事物中提取特征和性质,并不是事物本身。具体应该如何理解呢?

大家都知道,学生有一个共同的特征是必须学习,那么学什么,如何学,每一个学生就不一样了。这样可以提取学习这个动作为抽象方法,而不考虑具体内容。动物类都有叫的动作,具体动物如何叫,暂不考虑,先把共性提取出来。简单地说,用来描述这些共性的类就是抽象类,抽象类中不考虑具体实现,只确定必须具有的行为,就是抽象方法。

抽象方法是一个没有实现的方法,使用关键字abstract定义抽象方法。语法如下:

<访问修饰符> abstract 返回类型 方法();

例如:
public abstract void Cry();

当一个实例方法声明中含有abstract修饰符时,称之为抽象方法(abstract methods)。抽象方法只允许在抽象类中声明,但是并不能实现,抽象方法声明中只包含方法的签名,抽象方法在其派生类中使用override关键字来重写。在抽象方法声明中,不允许出现static、virtual或override中的任一修饰符。

注意:和普通方法不同,抽象方法没有闭合大括号,在方法括号后面直接加“;”号,表明抽象方法中没有方法体,即没有具体的实现。

C#抽象方法和虚拟方法理解的更多相关文章

  1. C#学习系列-抽象方法与虚拟方法的区别

    参考:http://www.microsoftvirtualacademy.com/Content/ViewContent.aspx?et=9851&m=9838&ct=31054 如 ...

  2. C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件

    一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...

  3. LVS专题-(3) 虚拟ip理解

    1.虚拟IP是什么? 要是单讲解虚拟 IP,理解起来很困难,所以干脆把 动态 IP .固定 IP .实体 IP 与虚拟 IP都讲解一下,加深理解和知识扩展 实体 IP:在网络的世界里,为了要辨识每一部 ...

  4. Android 自定义 view(四)—— onMeasure 方法理解

    前言: 前面我们已经学过<Android 自定义 view(三)-- onDraw 方法理解>,那么接下我们还需要继续去理解自定义view里面的onMeasure 方法 推荐文章: htt ...

  5. lazarus的动态方法和虚拟方法

    动态方法和虚拟方法在delphi里面分别表示: 动态方法 当需要调用父类.祖先类的被覆盖方法的时候,是查找继承树,当找到,就调用.减少了VMT占用,但调用慢一些. 虚拟方法 和动态方法不同的是,记录了 ...

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

     抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不 ...

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

    一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People   //声明一个抽象类 { ...

  8. C#中抽象方法与虚方法的区别(转)

    C#中抽象方法与虚方法的区别   一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class Peo ...

  9. 多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量

    多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了vir ...

随机推荐

  1. Hibernate主键生成策略(转)

    1.自动增长identity 适用于MySQL.DB2.MS SQL  Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...

  2. 下载更新文件后,调用安装器自动安装apk文件

    在更新操作时,下载新apk之后,往往需要自动安装新apk,用以下代码即可安装下载在本地的apk文件(apkFile) Intent intent = new Intent(); intent.setA ...

  3. 《UML大战需求分析阅读笔记》05

    在需求分析的阶段,非功能需求也是十分重要的一个阶段.部署图和构件图就能很好的描述非功能需求. 部署图从硬件的角度.物理层次上进行系统的整体规划,包括当前的IT架构以及改造后的IT构架,包括:Node: ...

  4. Enum

    1.定义时使用enum关键字定义. 2.隐式继承了java.lang.Enum类,所以不能再继承其他类了. 3.隐式的final修饰符,所以不能被其他类继承. package enumTest; pu ...

  5. Thinking in Java——笔记(11)

    Holding Your Objects In general, your programs will always be creating new objects based on some cri ...

  6. input range样式更改,模拟滑块

    input range 样式更改,js模拟滑块实时更新数据. 效果图: html 代码: <div> <span class="slider"></s ...

  7. ES6 基础知识

    let:用来定义变量特点:只能在代码块里面使用,let拥有块级作用域;并且let不允许重复声明; 比如: var a = 12; var a = 5; alert(a); //5; let a = 1 ...

  8. Linux TOP命令 按内存占用排序和按CPU占用排序

    P – 以 CPU 占用率大小的顺序排列进程列表M – 以内存占用率大小的顺序排列进程列表 http://blog.csdn.net/xiliuhu/article/details/6449377

  9. 开启JMX功能,使JVisvualVM能够连接JVM

    -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.manageme ...

  10. Leetcode: Unique Substrings in Wraparound String

    Consider the string s to be the infinite wraparound string of "abcdefghijklmnopqrstuvwxyz" ...