深入解析C#多态性:基类引用、虚方法与覆写机制

news2025/6/2 10:07:14

基类引用的本质

在C#面向对象编程中,派生类对象由基类部分和扩展部分组成。通过基类引用访问派生类对象时,实际是在进行「观察视角」的转换:

MyDerivedClass derived = new MyDerivedClass(); 
MyBaseClass mybc = (MyBaseClass)derived;  // 视角转换 
  • 🔑 基类引用只能访问继承链中的成员
  • ⚠️ 无法通过基类引用访问派生类新增成员(如示例中的var1)
  • 🖼️ 内存布局:基类部分始终位于对象内存起始位置

虚方法的多态魔法

当使用virtual和override组合时,将实现真正的多态行为:

// 基类定义 
virtual public void Print() { ... }
 
// 派生类覆写 
override public void Print() { ... }

✅ 调用链规则:

  • 通过基类引用调用时,自动寻找最高派生版本的实现
  • 实际执行的是运行时类型的方法(动态绑定)

🚫 常见错误:

  • 覆写方法访问级别不一致
  • 试图覆写非虚方法
  • 忘记override使用new导致隐藏而非覆写

多层继承中的覆写策略

在三级继承体系中,覆写行为呈现链式反应:

class Base { virtual void Print() }
class Derived : Base { override void Print() }
class SecondDerived : Derived { ... }
修饰符调用结果内存表现
override执行最顶层派生类方法法表指针指向最新实现
new停留在当前继承层级的实现创建独立方法槽,与基类实现并存

实战对比:override vs new

通过代码实验验证不同修饰符的效果差异:

// 情况1:使用override 
SecondDerived.Print => "SecondDerived"
mybc.Print => "SecondDerived"
 
// 情况2:使用new 
SecondDerived.Print => "SecondDerived" 
mybc.Print => "Derived"

📊 执行原理图解:

  • override形成方法调用链
  • new创建独立方法分支
  • 虚方法表(vtable)的结构差异

扩展应用:属性与索引器的覆写

多态机制不仅限于方法,同样适用于属性:

class Base {
    virtual int MyProp { get { return 5; } }
}
 
class Derived : Base {
    override int MyProp { get { return 10; } }
}

📌 属性覆写需保持:

  • 相同的名称和返回类型
  • 一致的访问器签名(get/set)

💡 索引器覆写同理:

  • 保持参数列表一致
  • 使用virtual/override修饰

最佳实践指南

合理设计虚方法:

  • 将可能变化的逻辑声明为virtual
  • 保持基类方法的稳定性

谨慎使用new修饰符:

  • 仅当需要刻意隐藏基类实现时使用
  • 添加XML注释说明隐藏意图

多态设计原则:

  • 遵循里氏替换原则
  • 通过抽象基类定义契约
  • 使用protected保护核心实现

关键理解:多态的本质是通过类型引用与对象实体的分离,实现「同一接口,多种实现」的面向对象特性。掌握虚方法机制,能显著提升代码的扩展性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2394141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!

摘要:人类的认知通常涉及通过抽象、灵活的概念进行思考,而不是严格依赖离散的语言符号。然而,当前的推理模型受到人类语言边界的限制,只能处理代表语义空间中固定点的离散符号嵌入。这种离散性限制了推理模型的表达能力和上限潜力…

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册 晨控CK-UR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题:围绕…

开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案

科研领域对机器人技术的需求日益增长,Hello Robot的移动操作机器人Stretch 3凭借其灵活性和性能满足了这一需求。其模块化设计、开源架构和高精度传感控制能力,使科研人员能够顺利开展实验。Stretch 3以其独特的移动操作能力,为科研探索提供了…

元胞自动机(Cellular Automata, CA)

一、什么是元胞自动机(Cellular Automata, CA) 元胞自动机(CA) 是一种基于离散时间、离散空间与规则驱动演化的动力系统,由 冯诺依曼(John von Neumann) 于1940年代首次提出,用于模…

智能手表单元测试报告(Unit Test Report)

📄 智能手表单元测试报告(Unit Test Report) 项目名称:Aurora Watch S1 模块版本:Firmware v1.0.4 测试阶段:模块开发完成后的单元测试 报告编号:AW-S1-UTR-2025-001 测试负责人:赵磊(软件架构师) 报告日期:2025-xx-xx 一、测试目的 通过对智能手表关键功能模块进…

微深节能 码头装卸船机定位与控制系统 格雷母线

微深节能码头装卸船机定位与控制系统:格雷母线技术赋能港口作业智能化升级 在现代化港口散货装卸作业中,装卸船机是连接船舶与陆域运输的核心枢纽设备。传统装卸船机依赖人工操作,存在定位偏差大、动态协同难、安全风险高等痛点。微深节能基于…

Python实现P-PSO优化算法优化循环神经网络LSTM分类模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的迅猛发展,循环神经网络(RNN)及其变体LSTM(Long S…

Scratch节日 | 龙舟比赛 | 端午节

端午节快乐! 这款专为孩子们打造的Scratch游戏——《龙舟比赛》,让你在掌控龙舟的竞速中,沉浸式体验中华传统节日的魅力! 🎮 游戏亮点 节日氛围浓厚:化身龙舟选手,在波涛汹涌的河流中展开刺激竞…

electron开发百度桌面应用demo及如何打包应用

1.开发入口文件main.js 1-1 加载百度URL const { app, BrowserWindow, nativeImage } require(electron) const path require(node:path)const createWindow () > {const win new BrowserWindow({width: 800,height: 600,})//加载百度URLwin.loadURL(https://www.baid…

关于用Cloudflare的Zero Trust实现绕过备案访问国内站点说明

cloudflare 是一个可免费的CDN,CDN(Content Delivery Network,内容分发网络)加速国内网站,通常是已备案的。Zero Trust类似FRP,可以将请求转发到目标服务器。在使用Zero Trust绕过备案访问国内网站需要&…

方正字库助力华为,赋能鸿蒙电脑打造全场景字体解决方案

2025年5月19日,搭载华为鸿蒙操作系统的鸿蒙电脑,面向用户推出集AI智能、互联流畅、安全保障和精致体验于一体的全新办公系统。作为鸿蒙生态核心字体服务商,方正字库为此次提供了全面的系统字体支持,涵盖中文、西文及符号三大类字库…

STM32 串口通信①:USART 全面理解 + 代码详解

一 前言 本篇文章并不会系统的从零开始讲起,适合大家对USART有一定的学习,再看本篇文章会有一定的收获,祝大家在本文中,吸收到新的知识。 二 通信方式 1)按数据传输的方式分(这就是“串行 vs 并行”&…

【Java Web】速通CSS

参考笔记:JavaWeb 速通CSS_java css-CSDN博客 目录 一、CSS入门 1. 基本介绍 2. 作用 二、CSS的3种引入方式 1. 行内式 1.1 示例代码 1.2 存在问题 2. 写在head标签的style子标签中 2.1 示例代码 2.2 存在问题 3.以外部文件的形式引入(开发中推荐使用)⭐⭐⭐ 3.1 说明 3…

NHANES指标推荐:ALI

文章题目:A cross-sectional study examining the relationship between the advanced lung cancer inflammation index and prostate cancer 中文标题:一项检查晚期肺癌炎症指数与前列腺癌之间关系的横断面研究 发表杂志:Journal of Health…

UE5 Mat HLSL - Load

特性Load()Sample()输入类型整数索引(int2/int3)浮点 UV 采样器状态(SamplerState)数据获取精确读取指定位置的原始数据基于 UV 插值和过滤后的数据典型用途精确计算、非过滤访问(如物理模拟)纹理贴图渲染…

【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程

摘要: 在 Unity 游戏开发中,键盘控制角色的移动与转向是基础功能之一。本文详细讲解如何使用 C# 实现基于 WASD 移动、QE 转向 与 Shift 加速奔跑 的角色控制器,适用于第一人称、第三人称、自由漫游等场景。通过直观的 Transform 控制方法与可…

HTML5 列表、表格与媒体元素、页面结构分析

1. 列表 无序列表 有序列表 定义列表 列表对比 2. 表格 跨列 跨行 跨行和跨列 3. HTML5的媒体元素 视频元素 注意:autoplay现在很多浏览器不支持了! 音频元素 4. 页面结构分析 5. 总结

换宽带ip地址会变吗?同一个宽带如何切换ip地址

在当今互联网时代,IP地址作为网络设备的"身份证",其重要性不言而喻。许多用户在使用宽带时都会遇到这样的疑问:换宽带IP地址会变吗?同一个宽带如何切换IP地址?本文将深入探讨这一问题,帮助读者全…

第100+41步 ChatGPT学习:R语言实现误判病例分析

本期是《第33步 机器学习分类实战:误判病例分析》的R版本。 尝试使用Deepseek-R1来试试写代码,效果还不错。 下面上R语言代码,以Xgboost为例: # 加载必要的库 library(caret) library(pROC) library(ggplot2) library(xgboost)…

贝锐蒲公英工业路由器R300A海外版:支持多国4G频段,全球组网

为更好地满足全球部署和企业出海项目的多样化需求,贝锐蒲公英异地组网工业路由器R300A海外版全新上市,并已正式上架速卖通!无论是跨国分支机构协同办公,还是海外工厂设备远程运维,R300A海外版都能为企业提供灵活、高性…