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. Android——Toast.makeText()

    1.Toast 作用 它是android中一种简单的消息提示框,它没有焦点(即不能被点击),会根据设置的时间自动消失. 2.介绍下Toast的参数 Toast t = Toast.makeText(M ...

  2. source insight使用

    左键选中后 ctrl+ 跳转到定义 alt+,返回到调用者的程序

  3. 从网页上抓取Windows补丁信息然后整型输出(Python)

    Powershell实现:http://www.cnblogs.com/IvanChen/p/4488246.html 今天通过Python实现: # coding=utf-8 import re i ...

  4. Mysql5.7.14安装配置

    Mysql5.7.14免安装版配置方法: 运行 在命令行中输入 mysqld install mysql5.7 安装成功后,启动mysql 在命令行中输入 net start mysql5.7 这个时 ...

  5. oracle 11g RAC 补丁升级方法

    一.自动升级方法 使用auto方式在两节点分别进行PSU的安装,安装PSU前注意更新opatch工具至PSU所要求版本,p22191577补丁包括GI和DB,分别执行即可. 两节点分别grid用户执行 ...

  6. PDMS二次开发之PML开发一些常见查询语句

    1.查找session 以及session number var !DBname DBname !db = object db(!DBname) !session = !db.lastsession( ...

  7. .NET Framework基础知识总结

    之前给大家总结了java的面试几次技巧总结,同学们看了觉得还是不错,能够得到大家的认可,感觉还是挺不错的.现在又有同学来想小编索要.NET面试的总结了,好吧.谁让小编这么好呢!以下是.NET面试之框架 ...

  8. 【java基础学习】网络编程

    网络编程 InetAddress tcp udp

  9. 《Linux及安全》实践3.1

    <Linux及安全>实践三 ELF格式文件分析 一.基础操作 1.查看大小端.32还是64 由此可以看出,本人实践所用到的是32位Ubuntu,数据存储采用小端法. 2.编写hello.c ...

  10. SQL CURSOR

    SET NOCOUNT ON; DECLARE @vendor_id int, @vendor_name nvarchar(50),     @message varchar(80), @produc ...