0

0

C# virtual关键字的作用 - 面向对象多态性的基础

幻夢星雲

幻夢星雲

发布时间:2025-12-05 09:42:35

|

1020人浏览过

|

来源于php中文网

原创

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

c# virtual关键字的作用 - 面向对象多态性的基础

virtual 关键字用于声明一个可以在派生类中被重写的成员(方法、属性、索引器或事件),它是实现运行时多态(即“晚绑定”)的必要前提。

让子类有机会改变父类的行为

没有 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 正式版
企业黄页模块 for PHPCMS9 GBK 正式版

PHPCMS V9采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求。 PHPCMS V9企业黄页主要特色1、模型自定义,支持模型添加、修改、删除、导出、导入功能;2、模型字段自定义,支持模型字段添加、修改、删除、禁用操作;3、分类无限添加,支持批量多级添加;4、新增附件字段功能,实现相同模型,不

下载
  • virtual + override → 多态生效,推荐用于扩展行为
  • abstract → 强制子类实现,适合定义契约(如模板方法中的钩子)
  • new → 静态绑定,容易引发歧义,一般应避免

一个典型的小例子

比如有个基类 Animal,定义 virtual void Speak();子类 DogCat 分别 override 它。那么:

  • Animal a1 = new Dog(); a1.Speak(); → 输出“汪汪”
  • Animal a2 = new Cat(); a2.Speak(); → 输出“喵喵”
  • 哪怕变量类型都是 Animal,执行的仍是实际对象所属类型的 Speak

这就是 virtual 支撑起的多态本质:同一调用,不同表现。

基本上就这些。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号