定义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. java并发编程的艺术(四)---ConcurrentHashMap原理解析

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  2. hdu 3085

    Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 使用AutoFac组织多项目应用程序

    较复杂的应用程序都是由多个项目组织成的,项目可以划分成程序集(Assemblies)和宿主(Hosts),也就是应用程序的入口.      Assemblies 通常是常见的类库项目,包括可以重用的功 ...

  4. Notepad++去除COPY代码行号的几种方法

    解2:打开 Notepad++,按住 Alt,鼠标点击拖出选择框,这个是列选 方法,相当拉风: 效果图如下

  5. HTML5新增的form属性简介——张鑫旭

    一.引言 HTML5中新增了一个名为form的属性,是一个与处理表单相关的元素. 在HTML4或XHTML中,我们要提交一个表单,必须把相关的控件元素都放在<form>元素下.因为表单提交 ...

  6. CSS属性display的浅略探讨

    display 的属性值有:none|inline|block|inline-block|list-item|run-in|table|inline-table|table-row-group|tab ...

  7. python学习笔记之—— calendar(日历)模块

    内置函数month() #!/usr/bin/python import calendar print calendar.month(2017,12) 输出: December 2017 Mo Tu ...

  8. 强网杯2018 pwn复现

    前言 本文对强网杯 中除了 2 个内核题以外的 6 个 pwn 题的利用方式进行记录.题目真心不错 程序和 exp: https://gitee.com/hac425/blog_data/blob/m ...

  9. 解决提交项目到GitHub,报错Please tell me who you are的问题

    描述: 在第一次提交项目到GitHub时,出现了以下问题 看了一下错误原因:Run git config --global user.email "you@example.com" ...

  10. Android自定义View探索—生命周期

    Activity代码: public class FiveActivity extends AppCompatActivity { private MyView myView; @Override p ...