c#中关于virtual,override和new的理解
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{ class Program
{
static void Main(string[] args)
{
father _father = new son1();
_father.printclassname();
son _son = new son1();
_son.printclassname();
son0 _son0 = new son1();
_son0.printclassname(); }
}
public class father
{
public father() { }
public void printclassname()
{
Console.WriteLine("father");
}
}
public class son : father
{
public son() { }
public new virtual void printclassname()
{
Console.WriteLine("son");
}
}
public class son0 : son
{
public son0() { }
public new virtual void printclassname()
{
Console.WriteLine("son0");
}
}
public class son1 : son0
{
public son1() { }
public override void printclassname()
{
Console.WriteLine("son1");
}
}
}
运行结果:

1.override修饰符指的是覆盖,实现动态调用,整个基础体系中必须要有一个virtual,一般为最顶层的父类用virtual,子类全部用override修饰,(但是不一定是最顶层用virtual,有可能是中间某一成开始用virtual,这时候的virtual需要和new修饰符一起使用,表示隐藏基类(把“非虚”功能也隐藏了,变成了“虚”),从此该函数开始变为虚函数了)以实现函数的重载,实现自己特定的功能。
2.new表示隐藏基类,这一点和C++中普通重载(非多态)是一样的。
c#中关于virtual,override和new的理解的更多相关文章
- C#中的virtual & override
很奇怪的设计,需要靠着两个Keyword共同作用,才能完成多态——而不是类似Java那样的默认多态.所谓共同作用,即基类使用virtual 标示函数,子类使用override显示重写. 有点奇怪,MS ...
- c#中的 virtual override 和abstract 以及sealed
1.如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法,而不能覆盖. 2.如果父类方法加了virtual关键字,即它是一个虚方法,在子类中一样可以隐藏. 3.如果子类 ...
- 浅析C#中new、override、virtual关键字的区别
Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...
- c#中abstract、override、new、virtual、sealed使用
abstract 修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现 ...
- c#中abstract、override、new、virtual、sealed使用和示例
原文地址:http://blog.csdn.net/richerg85/article/details/7407544 abstract 修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽 ...
- C#中的Virtual
在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtual. 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new ...
- NO.8:绝不在构造或者析构过程中调用virtual函数
在构造和析构执行期间不要调用virtual函数,因为这类调用从不会下降至derived class(比起当前执行构造函数和析构函数) 如果在base class 构造函数或者析构函数调用virtual ...
- C#学习笔记(16)——C#中重写(override)和覆盖(new)的区别
说明(2017-7-17 23:04:45): 原文: C#中重写(override)和覆盖(new)的区别 重写 用关键字 virtual 修饰的方法,叫虚方法.可以在子类中用override 声明 ...
- C# virtual,override,new 整理
今天仔细学习了一下C#中virtual, override, new关键字,参考了网上的很多资料,现整理一下. Virtual: virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可 ...
- C#关于private protected sealed Virtual/Override
Public:公开权限 Private:修饰类时类为程序集或者包含此类的类内部权限:修饰变量时只能类内部使用: Protected:修饰变量,只能继承类可以使用,对外(包括继承类的实例)无权限: Ab ...
随机推荐
- linux nc命令
即NetCat简写,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本.因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小).功能实用,被设计为一个简单.可靠的网络工具 ...
- display属性解析
none 此元素不会被显示 block 此元素将显示为块级元素,此元素前后会带有换行符. inline 默认.此元素会被显示为内联元素,元素前后没有换行符. inline-block 行内块元素.(C ...
- javascript 冒泡和事件源 形成的事件委托
冒泡:即使通过子级元素的事件来触发父级的事件,通过阻止冒泡可以防止冒泡发生. 事件源:首先这个东西是有兼容行问题的,当然解决也很简单. 两者结合使用,形成的事件委托有两个优势: 1.减少性能消耗: 2 ...
- 《第一行代码》学习笔记38-服务Service(5)
1.希望服务一旦启动就立刻去执行某个动作,可以将逻辑写在onStartCommand()方法里. 2.onCreate()和onStartCommand()的区别:onCreate()方法是在服务第一 ...
- UILable / UITextField / UIButton
// 获取屏幕大小的view UIView *contentView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; // ...
- ECstore报表不显示解决
最近研究ECSTORE发现后台报表显示空白,Google了一下发现N多统一的做法,直接往表里插几条数据.呵呵,更深入一点 1.要显示报表功能首先要确保已经配置好contab的定时任务,定时任务能够执行 ...
- JavaScript文本框统计字数
<html> <head> <title>enter</title> <script language="javascript" ...
- javascript中的一些基本方法收藏
W3C DOM 什么是DOM,DOM其实就是把一个HTML或者XML等符合W3C标准的文档内容模拟成一个JAVA对象,这样才能给JAVA或者JS来操作.下面是JS中模拟出的内置DOM对象documen ...
- gcd - b- 201611302317
谈到iOS多线程,一般都会谈到四种方式:pthread.NSThread.GCD和NSOperation.其中,苹果推荐也是我们最经常使用的无疑是GCD.对于身为开发者的我们来说,并发一直都很棘手,如 ...
- Unity GUI 用C#和Javascript写法的区别
以前都是用C#来写Unity的GUI.后来因为团队需要GUI必须用C#写. 其实一开始学Unity的GUI的时候我是想用C#来写,后来折腾了好久也没弄出来.反倒是这次不经意间就搞好了. C#和Java ...