浅谈C#之虚函数和重写

news/2024/9/17 16:17:06/ 标签: java, 开发语言, c#

一、基本介绍

        虚函数(Virtual Function)和重写(Override)是面向对象编程中多态性(Polymorphism)的实现方式之一。它们允许子类改变从基类继承来的行为。

虚函数(Virtual Function)

  • 虚函数是基类中用 virtual 关键字声明的方法。
  • 虚函数可以被子类重写,以提供不同的实现。
  • 虚函数的调用是在运行时(Runtime)决定的,这称为动态绑定(Dynamic Binding)。

重写(Override)

  • 当子类想要改变继承自基类的虚函数的行为时,可以使用 override 关键字来重写该方法。
  • 重写的方法必须与基类中的虚函数签名完全匹配。
  • 重写的方法提供了一个特定的实现,这个实现会覆盖基类中的虚函数。

二、示例代码

下面是一个简单的示例,展示了如何在C#中使用虚函数和重写:

// 定义一个基类
public class Animal
{// 虚函数public virtual void MakeSound(){Console.WriteLine("Some generic sound");}
}// 继承基类的子类
public class Dog : Animal
{// 重写基类中的虚函数public override void MakeSound(){Console.WriteLine("Woof!");}
}// 继承基类的另一个子类
public class Cat : Animal
{// 重写基类中的虚函数public override void MakeSound(){Console.WriteLine("Meow!");}
}public class Program
{public static void Main(){// 创建子类的实例Dog dog = new Dog();Cat cat = new Cat();// 调用方法dog.MakeSound(); // 输出: Woof!cat.MakeSound(); // 输出: Meow!// 使用基类引用调用子类的方法Animal myAnimal = new Dog();myAnimal.MakeSound(); // 输出: Woof!myAnimal = new Cat();myAnimal.MakeSound(); // 输出: Meow!}
}

在这个例子中,Animal 类有一个虚函数 MakeSound()DogCat 类重写了这个虚函数,提供了它们自己的实现。在 Main 方法中,即使我们使用 Animal 类型的引用来调用 MakeSound() 方法,实际调用的是 DogCat 类的重写版本,这就是多态性的体现。

三、注意事项

虚方法和重写的注意事项

  • 虚函数可以没有 virtual 关键字,但如果没有 virtual 或 override 关键字,那么它将不会表现出多态性,而是静态绑定(Static Binding)。
  • 虚函数和重写的方法签名必须完全相同,包括方法名、参数列表和返回类型。
  • 重写的方法不能比基类的虚函数的访问级别更严格。例如,如果基类中的虚函数是 public,那么重写的方法也必须是 public 或更宽松的访问级别。
  • 可以使用 sealed 关键字阻止进一步重写虚函数。


http://www.ppmy.cn/news/1524414.html

相关文章

【学习笔记】手写Tomcat 二

目录 响应静态资源 HTTP协议请求格式 1. 解析请求信息 创建解析请求类 HttpRequest 2. 创建静态资源目录 webs 3. 封装响应信息 创建静态资源处理器 StaticResourceHandler 创建响应类 HttpResponse 作业 1. 绘制 请求解析类 HttpRequest 和响应类 HttpResponse 的封…

动态规划(算法)---02.斐波那契数列模型_三步问题

题目链接: 面试题 08.01. 三步问题 - 力扣(LeetCode)https://leetcode.cn/problems/three-steps-problem-lcci/description/ 一、题目解析 题目: 题目讲解: 我们先举例查看规律: 第一台阶:我…

对比介绍Java Servlet API (javax.servlet)和Apache HttpClient这两个库

1. 基本概念 Java Servlet API (javax.servlet): 用途:主要用于构建服务器端的 Web 应用程序,处理 HTTP 请求和响应。功能:提供了创建和管理 Servlet 的接口,允许开发者处理来自客户端的请求并生成动态内容。 Apache H…

AcWing算法基础课-788逆序对的数量-Java题解

大家好,我是何未来,本篇文章给大家讲解《AcWing算法基础课》788 题——逆序对的数量。本文详细讲解了如何通过归并排序算法高效计算数组中的逆序对数量。通过递归分治和归并过程,我们不仅实现了数组的排序,还在排序过程中巧妙地计…

浪潮信息:构建高效、安全数据存储底座的领航者

浪潮信息在最新IDC发布的《中国企业级外部存储市场跟踪报告,2024Q1》中表现抢眼,以11.4%的市场销售额占比稳居中国存储市场第二,同比增长率高达13.6%,领跑头部厂商。这标志着浪潮信息在推动中国存储市场持续增长中扮演了关键角色&…

从表级血缘、列级血缘到算子级血缘,数据管理有哪些提升?

现如今,数据已成为企业决策和运营的核心驱动力,找数、用数已经成为企业实现精细化运营、智能化决策的重要环节。然而,数据规模快速增长、数据资产日益增多、加工链路愈发复杂,导致企业数据管理面临诸多挑战,如复杂数据…

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP…

Linux 基础命令-系统信息查看

Linux 基础命令——系统信息查看详解 在 Linux 系统中,了解和监控系统的状态和性能对系统管理员和开发者来说至关重要。Linux 提供了一组强大的命令,可以帮助我们查看系统信息,包括硬件、操作系统、CPU、内存、存储、网络等。 一、操作系统…

docker mysql 容器导入数据 .sql文件导入容器

docker mysql 容器导入数据 前言准备工作1、按需准备sql文件2、将文件上传服务器(宿主机)3、将sql文件复制进容器中 操作步骤1、进入容器内部2、进入数据库3、创建数据库4、切换数据库5、导入sql文件 前言 本文所涉及应用场景:远程部署环境…

基于MicroPython的ESP8266监控干簧管传感器状态设计方案

以下是一个基于MicroPython的ESP8266读取干簧管传感器模块状态的设计方案: 一、硬件准备 1. ESP8266开发板(如NodeMCU)。 2. 三线干簧管传感器一个。 3. 10K欧姆电阻一个。 4. 面包板、杜邦线若干。 5. 3.3V直流供电电源。 二、硬…

Xilinx系FPGA学习笔记(七)FIFO的IP核学习

系列文章目录 文章目录 系列文章目录FIFO介绍双时钟FIFO的IP核配置 FIFO介绍 FIFO(First In First Out),即先进先出。FPGA 或者 ASIC 中使用到的 FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者…

linux入门到实操-3 ​VIM编辑器:整体介绍、常用语法和指令、普通模式、编辑模式、命令模式

教程来源:B站视频BV1WY4y1H7d3 3天搞定Linux,1天搞定Shell,清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料(包含课程同版本linux系统文件等内容),供大家学习交流下载:…

Rust使用之【宏】

一、简单使用clap clap { version "4.5.17", features ["derive"] }其中,什么是features ["derive"]:表示你希望在添加 clap 依赖时启用 derive 特性。这通常意味着你希望使用 clap 的派生(derive&#x…

Flink CEP(复杂事件处理)高级进阶

Flink CEP(Complex Event Processing,复杂事件处理)是 Apache Flink 中用于复杂事件模式检测的库。它允许用户定义复杂的事件模式,从流数据中检测出符合模式的事件序列。这在实时监控、欺诈检测、用户行为分析等场景中非常有用。 Flink CEP 高级进阶 为了深入理解和使用 …

网络安全架构师

网络安全架构师负责构建全面的安全框架,以保护组织的数字资产免受侵害,确保组织在数字化转型的同时维持强大的安全防护。 摩根大通的网络安全运营副总裁兼安全架构总监Lester Nichols强调,成为网络安全架构师对现代企业至关重要,…

DApp开发入门指南:从概念到实践

随着区块链技术的不断发展,去中心化应用(DApp)逐渐成为科技领域的热门话题。DApp不仅打破了传统应用的中心化控制,还为开发者和用户提供了更高的安全性、透明度和自治性。本文将带你深入了解DApp的开发流程以及如何设计合理的DApp…

[数据集][目标检测]汽车头部尾部检测数据集VOC+YOLO格式5319张3类别

数据集制作单位:未来自主研究中心(FIRC) 版权单位:未来自主研究中心(FIRC) 版权声明:数据集仅仅供个人使用,不得在未授权情况下挂淘宝、咸鱼等交易网站公开售卖,由此引发的法律责任需自行承担 数据集格式:Pascal VOC格…

nano 和 vim对比

nano 和 vim 是两种流行的文本编辑器,各有优缺点和适用场景。以下是对这两种编辑器的详细对比: Nano 优点: 1.简单易用:nano 的界面和命令非常简单,易于新手上手。所有的命令都列在屏幕底部,不需要记住复…

【C++题解】1330. 求最大梯形的面积

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1330. 求最大梯形的面积 类型:二维数组 题目描述: 从键盘读入 n ( 3≤n≤100 )个梯形的上底、下底和高,请问这 n 个梯形中,最大面积…