浅谈C#之虚函数和重写

news/2024/12/23 6:40:49/

一、基本介绍

        虚函数(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、内存、存储、网络等。 一、操作系统…