A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓江红 中级黑马   /  2014-4-1 11:23  /  985 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

虚方法具体怎么使用,什么时候会用到?

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

3 个回复

倒序浏览
虚方法的定义若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法。若其中没有 virtual 修饰符,则称该方法为非虚拟方法。
回复 使用道具 举报
不好意思,刚摁错键了补充一下。当一个方法为虚方法的时候,这个方法就可以在子类方法中可以重写,也可以不用从写直接使用,如果子类方法要重写父类的方法必须在子类方法前加关键字override,必须也只能用这个关键字。虚方法就是为了实现多态功能,他具有扩张开放修改封闭的原则,当需要扩展多个子类方法,又不能修改父类方法实例化对象时,把父类标记为虚方法,任何一个子类方法都可以将他实例化。以达到多态的功能。这只是自己的理解

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
当实例方法声明包含 virtual 修饰符时,称该方法为虚拟方法。不存在 virtual 修饰符时,称该方法为非虚拟方法。

非虚拟方法的实现是不变的:无论是在声明它的类的实例上调用该方法还是在派生类的实例上调用,实现都是相同的。与此相反,虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法之实现的过程称为重写方法

在虚拟方法调用中,为其进行调用的实例的运行时类型确定要调用的实际方法实现。在非虚拟方法调用中,实例的编译时类型是决定性因素。准确地说,当在具有编译时类型 C 和运行时类型 R 的实例(其中 R 为 C 或者从 C 派生的类)上用参数列表 A 调用名为 N 的方法时,调用按下面这样处理:

首先,将重载决策应用于 C、N 和 A,以从在 C 中声明和由 C 继承的方法集中选择一个特定方法 M。
然后,如果 M 为非虚拟方法,则调用 M。
否则,M 为虚拟方法,调用就 R 而言 M 的派生程度最大的实现。
对于在类中声明或者由类继承的每个虚拟方法,存在一个就该类而言的派生程度最大的实现。就类 R 而言虚拟方法 M 的派生度最大的实现按下面这样确定:

如果 R 包含 M 的引入 virtual 声明,则这是 M 的派生程度最大的实现。
否则,如果 R 包含 M 的 override,则这是 M 的派生程度最大的实现。
否则,M 的派生程度最大的实现与 R 的直接基类的派生程度最大的实现相同。

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马