新闻中心
C# virtual关键字的作用 - 面向对象多态性的基础
virtual关键字允许派生类重写父类方法,实现运行时多态;父类用virtual声明可被重写的方法,子类用override提供具体实现,调用时根据实际对象类型确定执行版本,而非引用类型。只有非静态、非私有、非密封的实例成员才能声明为virtual,构造函数、析构函数、静态成员等不可使用。与abstract不同,virtual方法可有默认实现且不强制重写;与new关键字的隐藏机制不同,virtual+override构成真正多态。例如Animal基类定义virtual Speak(),Dog和Cat分别override,通过Animal引用调用Speak时,会动态执行对应子类方法,体现“同一调用,不同行为”的多态特性。

virtu
al 关键字用于声明一个可以在派生类中被重写的成员(方法、属性、索引器或事件),它是实现运行时多态(即“晚绑定”)的必要前提。
让子类有机会改变父类的行为
没有 virtual,父类的方法默认是“封闭”的——子类即使写一个同名方法,也只是隐藏(hide)而非重写(override),调用时取决于变量的声明类型,不是实际对象类型。加上 virtual,才真正开启多态大门。
- 父类中用 virtual 标记方法,表示“我允许子类按需重新定义逻辑”
- 子类用 override 响应,表示“我明确要替换这个虚方法的具体实现”
- 调用时,.NET 运行时根据对象的实际类型(而非引用类型)决定执行哪个版本
不是所有成员都能加 virtual
virtual 只能修饰非静态、非私有、非密封(non-sealed)、非构造函数的实例成员。
- 不能修饰 static 方法:多态依赖实例,静态方法与类型绑定,不参与对象动态分发
- 不能修饰 private 成员:子类根本不可见,谈不上重写
- 不能修饰 sealed 类的成员:sealed 类不允许继承,virtual 就失去意义
- 构造函数、析构函数、运算符重载也不能是 virtual
和 abstract、override、new 的区别要拎清
virtual 是“可选重写”,abstract 是“必须重写”(且只能在 abstract 类中);override 必须配合 virtual 或 abstract 使用;而 new 是显式隐藏父类成员,不构成多态,只是屏蔽警告。
企业黄页模块 for PHPCMS9 GBK 正式版
PHPCMS V9采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求。 PHPCMS V9企业黄页主要特色1、模型自定义,支持模型添加、修改、删除、导出、导入功能;2、模型字段自定义,支持模型字段添加、修改、删除、禁用操作;3、分类无限添加,支持批量多级添加;4、新增附件字段功能,实现相同模型,不
0
查看详情
- 用 virtual + override → 多态生效,推荐用于扩展行为
- 用 abstract → 强制子类实现,适合定义契约(如模板方法中的钩子)
- 用 new → 静态绑定,容易引发歧义,一般应避免
一个典型的小例子
比如有个基类 Animal,定义 virtual void Speak();子类 Dog 和 Cat 分别 override 它。那么:
- Animal a1 = new Dog(); a1.Speak(); → 输出“汪汪”
- Animal a2 = new Cat(); a2.Speak(); → 输出“喵喵”
- 哪怕变量类型都是 Animal,执行的仍是实际对象所属类型的 Speak
这就是 virtual 支撑起的多态本质:同一调用,不同表现。
基本上就这些。
以上就是C# virtual关键字的作用 - 面向对象多态性的基础的详细内容,更多请关注其它相关文章!
# 绑定
# 百度seo软件都找乐云seo专家
# 萍乡电商营销推广代理商
# 10个网站怎么优化
# 链接营销推广怎么取消
# 常用网站建设软件
# 青岛矩阵seo在线咨询
# 海宁提供企业网站推广优势
# 韶关seo广告投放价格
# 网站seo外链建设
# 常州app营销推广
# 长时间
# 类中
# c#
# 而非
# 运算符
# 企业黄页
# 面向对象
# 多态
# 重写
# 子类
# speak
# .net
# 区别
# virtual
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
小红书网页版入口链接分享 小红书官网直接进
12306选座怎么选到商务座_12306商务座选择与配置说明
如何提高微信支付的安全性_微信支付安全防护与设置建议
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
响应式图片在网页设计中的正确实现方法
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
excel怎么制作工资条 excel快速生成工资条的方法
Go语言中JSON数据解析与字段访问教程
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
C++ map遍历方法大全_C++ map迭代器使用总结
J*a中实现Go语言select通道多路复用机制
Win11怎么开启高性能模式_Windows 11电源计划优化设置
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
126邮箱账号注册 电脑版登录入口
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
ArrayList与LinkedList核心操作的Big-O复杂度分析
poki网页游戏推荐_poki免费游戏平台入口
如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
蛙漫2台版漫画地址 Manwa2正版网页版链接
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤
J*aScript中在Map循环中检测并处理空数组元素
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
如何在J*a中使用Locale处理多语言环境
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
限制HTML日期输入框的日期选择范围
React列表渲染与独立状态管理:避免全局状态影响局部更新
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
Python多版本共存与虚拟环境管理深度指南
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
优化Django表单:提交验证失败后保留用户输入
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
J*a里如何使用forEach遍历Map_Map遍历方法说明
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
Composer中的^和~符号代表什么_精通Composer版本号语义化约束


2025-12-05
浏览次数:次
返回列表