关于C#中关键字new override的使用(与C++对比)

c#/Unity中new override virtual的底层IL实现及区别 首先我们创建一个用于被继承的类 Mira1: class Mira1 { public virtual void f1() { Debug.Log("parent f1"); } public void f2() { Debug.Log("parent f2"); } } 然后创建 Mira1 的子类 Mira2: class Mira2 : Mira1 { public void f1() { 阅读详情

俺是c#的新手,第一次接触,看到网上关于new/override资料学习了一下,记录下自己的体会

class Program

 {

    static void Main(string[] args)

    {

            baseClass bc;

            class1 ct1 = new class1();

            class2 ct2 = new class2();

              bc = ct2;

            bc.prinf();        

            bc = ct1;

            bc.prinf();

       bc.prinf();

    }

 }

 

public class baseClass

{

    private int index = 0;

    public virtual void prinf()

    {

        Console.WriteLine(""); //在c#中用于换行

        Console.WriteLine("这是基类虚方法" + index.ToString());

    }

}

 

public class class1 : baseClass

{

    private int index = 1;

    public override void prinf()

    {

        Console.WriteLine("");

        Console.WriteLine("这是子类新的方法" + index.ToString());

     }

}

 

public class class2 : baseClass

{

    private int index = 2;

    public new void prinf()

    {

        Console.WriteLine("");

        Console.WriteLine("这是子类新的方法" + index.ToString());

   }

}

 

 

输出信息:

 

这是子类新方法1

 

这是基类新方法0

 

说明:

1.类名 对象名并不能创建对象,在c#中要类名 对象名 = new 构造函数

2.与C++不同,C#的对象赋值表示引用,只能子类对象赋值给基类,即使这样,基类也只能引用派生类中基类的部分,作为以上例子中的public new void prinf(),子类class2重写了函数prinf,也就是说函数的地址已经不再是原先基类的函数地址了,这样基类即使引用也只能是原先自己的printf函数,而class1的public override void prinf()使用的是override,表示将原先基类的printf方法重写,函数地址并没有发生改变,因此基类引用的将是重写后的函数。

3.只有基类是virtual,子类才能使用override

 

 

对比C++

class father

{

public:

        virtual void output()

       {

              cout<<"father output"<<endl;

       }

};

 

class child1:public father

{

public:

       void output()

       {

              cout<<"child1 output"<<endl;

       }

};

 

class child2:public father

{

public:

       void output()

       {

              cout<<"child2 output"<<endl;

       }

       void childfun()

       {

              cout<<"child2 childfun call"<<endl;

       }

};

 

void fun(father *p)

{

       p->output();

}

 

void main(void)

{

       father fa;

       child2 ch;

       fa = ch;

       fa.output();

 

       father fath = ch;

       ch.output();

     

       father *p = &ch;

       fun(p);

       p->childfun(); //错误,与C#的多态原理相同,作为父类的指针p只能指向子类继承父类的函数,

       p->output();   //由于多态性的原理,将输出子类重写后的函数 child2 output

       ch.childfun();

 

       father *p = &ch;

       fun(p);

}

 

 

重写全局new/delete示例 重写Global new/delete示例 立即下载

相关推荐

C#中Override关键字和New关键字的用法详解

C# 语言经过专门设计,以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容。这具有多方面的意义。例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为。它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法。 在 C# 中,派生类可以包含与基类方法同名的方法。 基类方法必须定义为 virtual。 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。 如果派生类中的方法前面带有 new 关键

【C#学习笔记(一)】override关键字详解(转载)

C# 中有重写、重载、覆写的概念,分别对应的关键字是override、overload、new,在本文中主要介绍 override 关键字,主要参考了此篇文章C# 重写(override)。

禾戊之昂的博客 4870

噪声整形与过采样实战:从N-bit ADC到DSM的SQNR优化指南

本文深入探讨了噪声整形与过采样技术在DSM(Delta-Sigma调制器)中的应用,重点分析了量化器位数(N)、滤波器阶数(L)和过采样率(OSR)对SQNR优化的影响。通过实战案例和参数协同优化策略,帮助工程师在音频处理和通信系统设计中实现更优的信号质量。

weixin_42561040的博客 339

C#关键字之override详解

重载、重写、覆写,分别指的是overload、override、new。 一、override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。用于扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。提供从基类继承的成员的新实现,而通过override声明重写的方法称为基方法。 注意事项: 1.重写基方法必须具有与override方法相同的签名。 2.

Carey 6万+

深度学习暑期科研项目(两个月发EI论文)

对本科生而言,越早接触系统的科研训练开始上手科研项目,就越能在未来的升学求职中占据很大的优势。暑假是提升个人简历、丰富科研经历的最佳时期!哈尔滨工业大学博士师兄也会在8月1日开始带大家上手科研项目,并撰写发表EI会议论文。

Magnolia_He的博客 1441

Multisim新手必看:从零搭建数字时钟仿真电路(附完整原理图)

本文详细介绍了如何使用Multisim从零开始搭建数字时钟仿真电路,涵盖晶振电路设计、计数电路实现、校时功能配置等关键步骤。通过完整的原理图和实用技巧,帮助新手快速掌握Multisim仿真设计,实现精准的数字时钟功能。

ios99的博客 328

C#关键字 abstract,override,virtual的用法

什么是抽象类:abstract关键字修饰的类称为抽象类,抽象类不能被实例化,抽象类是派生类的基类。 关键字:abstract 语法: public abstract class类名 { ………… } 1、一个抽象类可以同时包含抽象方法和非抽象方法,但不能实例化。 2、抽象方法只是在派生类中真正实现,这表明抽象方法只存放函数原型,斌不涉及主体代码, 3、派生自抽象类的类需要实现其基类的抽象方法,才...

sinat_31608641的博客 858

NRF52832调试方法1——HardFault_Handler问题定位

一、遇到问题 keil debug模式下,直接点击全速运行(Run)发现程序卡死,点击stop按钮后,停到了HardFault_Handler位置,如下图所示。 此时使用navigate backwards(蓝色左箭头)是无效的,找不到程序卡在哪里。 二、解决办法 此时首先观察register窗口 若Stack为MSP,则复制R13(SP)的值到memory观察窗的地址搜索栏。每一行显示连续的28个地址上的存储信息,每个地址上存有一个字节。 从第21个位置起的连续四个字节是LR的值,

小梁的博客 3650

C# new关键字和override

using System; class MyBaseClass {     virtual public void Print()     {Console.WriteLine("This is the 鸡 class.");} } class MyDerivedClass:MyBaseClass {     override public void Print()     {Console.WriteLine("This is the derived 派生的 class.");} }

kingdompk722的专栏 366

SpeedyBee F405 V3 50A飞塔装机全攻略:从开箱到首飞避坑指南

本文提供SpeedyBee F405 V3 50A飞塔的详细装机指南,涵盖从开箱检查、硬件焊接、软件配置到安全首飞的全流程。重点剖析了电源连接、固件刷写等高频故障点,帮助FPV新手避开常见陷阱,确保一次成功组装并安全起飞。

weixin_29179311的博客 416

台区同期线损智能诊断与闭环治理体系及工程化实践

高损台区:同期线损率>预设阈值(通常为8%,可根据区域、台区类型调整);负损台区:同期线损率<0,即供电量小于售电量,多由档案、计量、拓扑错误导致;波动损台区:月度线损率波动幅度>预设阈值(通常为5%),且无合理原因;持续异常台区:连续2个及以上周期线损率不达标,且未完成有效整改。台区同期线损智能诊断与闭环治理体系,以电力大数据为基础、智能诊断模型为核心、标准化流程为保障,彻底解决了传统线损治理“异常发现慢、定位难、整改乱、无闭环”的痛点,实现了线损治理从“人工经验驱动”向“数据智能驱动”的根本性转型。

getusushu的博客 204

C#中Override与New关键字的运用及实例解析

override 和 new 是 C# 中处理继承和多态性的关键字。使用 override 可以重写基类中的虚方法,实现多态性,使得运行时能够调用到派生类的实现。而使用 new 则隐藏基类中的成员,创建新的实现,这种隐藏不会影响基类的行为,也不参与多态性。理解这两个关键字的区别和适用场景对于编写健壮和可维护的代码至关重要。

qq_35320456的博客 1621

学 Simulink—— 基于高频方波电压注入的表贴式永磁电机无感控制仿真

本文手把手教授基于Simulink的高频方波电压注入法实现表贴式永磁同步电机(SPMSM)无传感器控制。针对表贴式电机微弱凸极特性(Lq/Ld≈1.05-1.15),详解方波注入相比正弦注入的优势:通过5kHz方波(PWM频率半值)集中能量提升信噪比,并采用相邻周期电流直接相减的零延迟分离技术。系统架构包含高频注入器、无滤波器信号分离模块、锁相环观测器和磁饱和极性辨识等关键环节,提供参数设置经验(如注入幅值10-15%Vdc)和典型性能指标(位置误差<0.2rad)。特别强调工程实现要点:PWM同步时

xiaoheshang_123的博客 167

C# 子类实例化基类 基类使用不了子类的方法_C#笔记(Virtual,Abstract,Override,new)...

1.Virtual + Override C#支持重写实例方法和属性,但不支持重写字段或任何静态成员。 为了进行重写,要求在基类和派生类中都显式地执行一个操作,在基类中,必须将允许重写的每个成员标记为virtual。假如一个virtual或protected成员没有包括virtual修饰符,就不允许子类重写该成员。 与Java相比,默认情况下Java中的方法都是虚方法,如果希望方法具有非虚的...

weixin_39586353的博客 562

使用MATLAB中的Simulink工具来构建一个微电网系统的仿真平台

微电网是指由分布式电源(如太阳能、风能等)、储能装置、负载以及控制和保护装置组成的局部电力系统。它可以独立于主电网运行,也可以与主电网并联运行。本示例将以一个简单的微电网为例,展示如何利用Simulink进行微电网接入与孤岛运行策略的设计与仿真。分布式电源:模拟太阳能光伏板或风力发电机等分布式电源。储能装置:用于存储多余能量或补充不足能量。负载:模拟实际用电需求。双向变流器:实现直流与交流之间的转换,并支持并网和孤岛模式切换。控制器:负责管理微电网的运行模式,包括并网控制和孤岛控制。

xiaoheshang_123的博客 345

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Overload Overwrite Override

C++: Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。 Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(...

weixin_30307921的博客 154

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C#中的override和new关键字

问题1: 虚方法首先,看下面的代码。namespace CSharpTest { class A { public void fun() { Console.WriteLine("这是父类方法"); } } class B : A { public void fun()

给永远比拿愉快 4563

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# override与new关键字对比

在 C# 中,new 关键字可用作运算符、修饰符或约束。 new 运算符:用于创建对象和调用构造函数。例如:object obj = new object();new 修饰符:用于向基类成员隐藏继承成员(既然是隐藏,那么还是可以被“发现”的)。new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型(即如果需要在泛型类型内部实例化参数类型的对象,那么必须对类型参数加以默认构造函数约束)。例如:class Factory where U: new(){   public static U GetNew(

Kewin 797

有关C#关键字new、override、virtual的总结

这篇文章摘抄总结自: 1.张令 2.祥叔学编程 3.MSDN 先看一个例子: class Program { static void Main(string[] args) { contact ct1 = new class1(); contact ct2 = new class2();

c337134154的专栏 766

C#-new 和 override 的区别

//overridepublic class A...{    public A()    ...{        Console.WriteLine("A constructing");               this.GetYear();    }    public virtual void GetYear()    ...{        Console.WriteLine("A

MasterFT的专栏 1513

[C#] 小记 new 和 override 关键字

C#要想实现函数的override,要求和C++一样,父类的函数必须用virtual关键字注明,随后在子类中用override关键字表明重写的函数。 子类同名函数定义时,如果什么都不写,或者使用new 关键字,效果都表示父类的同名函数将被隐藏。 也就是说,子类有子类的函数,父类有父类的函数,井水不犯河水。 需要注意的是:若B是A的子类,我们通过 A a = new B()的方式实例化一个B的...

weixin_30432007的博客 107

c#报错不实现接口成员_C#笔记(Virtual,Abstract,Override,new)

1.Virtual + Override C#支持重写实例方法和属性,但不支持重写字段或任何静态成员。 为了进行重写,要求在基类和派生类中都显式地执行一个操作,在基类中,必须将允许重写的每个成员标记为virtual。假如一个virtual或protected成员没有包括virtual修饰符,就不允许子类重写该成员。 与Java相比,默认情况下Java中的方法都是虚方法,如果希望方法具有非虚的...

weixin_35537968的博客 724

浅谈new、override、virtual

简要:new、override、virtual、new和override的区别、虚方法 一、new 在C#中,new这个关键字使用频率非常高,主要有3个功能: a) 作为运算符用来创建一个对象和调用构造函数。 b) 作为修饰符。 隐藏作用! c) 用于在泛型声明中约束可能用作类型参数的参数的类型。 a) 作为运算符 new关键字...

daya3957的博客 148

C#.NET中new, override, virtual abstract关键字的区别

本以为这些不难,可是细细研究,发现不是那么回事,还有点复杂,特记录之。 查到的资料如下: 1. 谈谈C#中的三个关键词new , virtual , override2. 温故而知新:new与override的差异以及virtual方法与abstract方法的区别3. abstract、virtual、override、new說明 根据上面三

roofwei的专栏 2495

使用 Override 和 New 关键字进行版本控制(C# 编程指南)

C# 语言经过专门设计,以便不同库中的 基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容。这具有多方面的意义。例如,这意味着在基 类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为。它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法。 在 C# 中,派生类可以包含与基类方法同名的方法。

Sky 的专栏 435
上一篇: C++的内存分配
chm_study
博客等级 码龄19年 2粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值