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中的任一修饰符。

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

最新文章

  1. iOS &#39;The sandbox is not sync with the Podfile.lock&#39;问题解决
  2. Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError
  3. Mac OS下配置Eclipse C++的方法
  4. Cocos2d-x PluginX (一)使用手册
  5. Clojure学习笔记(二)——函数式编程
  6. 抓包排错-tcp.flags.reset
  7. SpringMVC整合TaskExecutor线程池的配置/使用
  8. Assembly(c#中简单说明[转]
  9. C语言-字符编码转换:UTF与GB2312
  10. RabbitMQ入门-消息订阅模式
  11. SSH框架项目开发命名规范
  12. 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析
  13. 如何去掉(隐藏)系统的StatusBar(状态栏)
  14. TCP/IP数据加密传输及CA简述
  15. CSS中一个冒号和两个冒号有什么区别
  16. 题解——CodeForces 438D The Child and Sequence
  17. 【BZOJ2589】 Spoj 10707 Count on a tree II
  18. 前端 HTML 常用标签 head标签相关内容
  19. MySQL笔记(二)数据库对象的创建和管理
  20. REST 服务器调试 RESTDebugger.exe 和浏览器测试

热门文章

  1. 深入浅出Android App耗电量统计
  2. mysql数据库迁移
  3. 不修改代码就能优化ASP.NET网站性能的一些方法
  4. 【iCore3应用开发平台】发布 iCore3 应用开发平台出厂代码rev0.0.5
  5. OMXplayer播放视频的参数说明
  6. java使用poi包将数据写入Excel表格
  7. Tomcat 随机挂掉
  8. sql server 存储过程 以及java如何使用存储过程
  9. JS检测移动端横竖屏
  10. QMap