定义Person类:

     class Person
{
public void Say()
{
Console.WriteLine("I am a person");
}
}

现在,我想定义一个Stu类, 并且继承Person类,并且我想让Stu类有属于自己的Say方法

  class Stu:Person
{
public string school="Oxford";
public void Say()
{
Console.WriteLine("I am a student from " + school);
}
}

然后,在Main函数中,分别实例化Person类和Stu类

 class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Say(); Stu stu= new Stu();
stu.Say(); person=stu;
person.Say();
}
}

在控制台中,输入csc Program.cs编译,如下图

(请选择你自己喜欢的编译器,并包含编译器的位置到path环境变量中,如path=%path%;C:\Windows\Microsoft.NET\Framework64\v2.0.50727)

编译后,如上图我们看到有个警告,意思是Stu类中的Say方法,隐藏了Person类中的Say方法,如果确实有需要,喊我们显示地使用new关键字去隐藏,做如下改动

     class Stu:Person
{
public string school="Oxford";
public new void Say()
{
Console.WriteLine("I am a student from " + school);
}
}

编译后,没发现警告了,可运行效果并不是我想要的,最后一行的输出,并没有实现多态

现在在父类使用virtual关键字,在子类使用override关键字重写父类的方法。

  class Person
{
public virtual void Say()
{
Console.WriteLine("I am a person");
}
} class Stu:Person
{
public string school="Oxford";
public override void Say()
{
Console.WriteLine("I am a student from " + school);
}
}

运行效果如下:

这样,我们通过在父类使用virtual关键字修饰方法,在子类使用override关键字重写父类方法,这样我们就正确实现了多态。

除了virtual关键字,我们还可以使用abstract关键字修饰父类的方法,可以实现相类似的功能,但abstract修饰的方法不能有实现,并且该方法所在的类必须是abstract类

扯不清楚的virtual和abstract的更多相关文章

  1. sealed、new、virtual、abstract与override 趣解

    1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于 方法或属性时,sealed修饰符必须始终与override一起使用. ...

  2. virtual和abstract

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的. ...

  3. C#中virtual与abstract的区别

    C#中virtual与abstract的区别 C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新定义,覆盖父类的定义.但是用法上差别很大. a)     ...

  4. C# virtual和abstract的

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

  5. asp.net中virtual和abstract的区别

    这篇文章主要介绍了asp.net中virtual和abstract的区别,较为详细的分析了virtual与abstract的概念与具体用法,并以实例的形式予以总结归纳,需要的朋友可以参考下 本文实例分 ...

  6. asp.net中virtual和abstract的区别分析

    这篇文章主要介绍了asp.net中virtual和abstract的区别,较为详细的分析了virtual与abstract的概念与具体用法,并以实例的形式予以总结归纳,需要的朋友可以参考下 本文实例分 ...

  7. sealed、new、virtual、abstract与override 总结

    1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...

  8. virtual和abstract的区别

    virtual和abstract都是用来修饰父类的,前面不能用private私有,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的.  毕竟加上virtual或abstract就是让子类重新定义 ...

  9. virtual和abstract区别

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

随机推荐

  1. Springboot --- Spring Security (一)

      文章部分图片来自参考资料 问题 : Spring Security 内部实现的原理是什么 概述 Spring Security 是个安全框架,可以提供认证,防止网络功能等功能,可以结合 sprin ...

  2. 转载:SQL中Group By 的常见使用方法

    SQL中Group By 的常见使用方法  转载源:http://www.cnblogs.com/wang-meng/p/5373057.html 前言今天逛java吧看到了一个面试题, 于是有了今天 ...

  3. Servlet 思维导图

  4. 【转】Apache服务器的下载与安装

    PHP的运行必然少不了服务器的支持,何为服务器?通俗讲就是在一台计算机上,安装个服务器软件,这台计算机便可以称之为服务器,服务器软件和计算机本身的操作系统是两码事,计算机自身的操作系统可以为linux ...

  5. 求N的因子之和。

    理论依据: 代码: /* 显然,数据够大的时候,数组要用 __int64 */ #include<iostream> #include<map> #include<cst ...

  6. CassiniDev源码学习 - 可替代IIS的单机Web Form解决方案

    最近一个项目是将web版的程序,改为单机版.话说这个web版号称当年十几个人用了至少3个月的时间开发,后来三年还不断有修改,而现在要在1个月内由一个人完成,这简直是不可能完成的任务!直觉告诉我,重写肯 ...

  7. centos 快速安装wordpress

    1.两种方式得到Wordpress 首先你可以去wordpress官方网站看下最新的wordpress的下载地址多少.比如wordpress 3.9.1的下载地址是: http://cn.wordpr ...

  8. 换算rem的宽度和高度不生效 chrome字体最小为12px

    现在很多前端都用rem来单位元素和字体大小 一般的设置是 html{ font-size:62.5%; } 换算来源 1rem = 16px 10/16 = 0.625 这样10px 就等于了1rem ...

  9. 2017年5月22日 HTML基础知识(一)

    一.Html 结构 1.1.HTML基本文档格式—<html> 标记 —<html>文档的头部好和主体内容 </html>  根标记 —<head> 文 ...

  10. JSON学习笔记-4

    JSON 数组 1.访问数组 1.一次访问一个嵌套内容值var myObj, x; myObj = { "name":"网站", , "sites&q ...