问个关于类继承的问题

wdl131415 2011-08-04 11:47:39
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public class BaseClass
{
public virtual void Write()
{
}
}
public class NewClass:BaseClass
{
public override void Write()
{
Console.WriteLine("Welcome");
}
}
class Program
{
static void Main(string[] args)
{
NewClass myClass = new NewClass();
BaseClass yourClass =myClass ;
yourClass.Write();
Console.ReadKey();
}
}
}

这上边是代码--------------------------------------------------------------------------------------
结果是会输出派生类的Write方法
请问这为什么会这样呢 ?【BaseClass yourClass =myClass ;】这句代码实际上是不是给myClass新添了个引用 或应该叫指针? 希望指点下 谢谢
...全文
124 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdl131415 2011-08-07
  • 打赏
  • 举报
回复
难道只能用base来访问基类中被重写的方法?[Quote=引用 9 楼 stonespace 的回复:]
引用 7 楼 wdl131415 的回复:
额 有点蒙了 那什么时候基类虽然被派生类覆盖了 但我们实例化派生类 然后用一个基类类型的变量引用它 在调用【基类.被派生类覆盖的方法】会调用基类的方法呢?



这是谁写的?我认为是错的,应该不是调用基类方法,而是调用派生类方法,你可以做个试验,
[/Quote]
stonespace 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wdl131415 的回复:]
那我们可不可以这么想 【一个派生类相当于同时拥有了基类和派生类的所有成员,那现在用一个基类类型的变量来引用该派生类的一个实例就等于把派生类的成员全抹杀了,我觉得到这都很通,但接着我们调用那个基类的虚拟方法,结果显示的却是派生类的覆盖方法?莫名其妙了】
能给个好理解点的吗?
[/Quote]

不对,virtual方法在c++被称为实例方法,不管指针和引用是基类还是派生类,调用virtual方法的时候,都会调用实例也就是派生类的对应方法,
stonespace 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wdl131415 的回复:]
额 有点蒙了 那什么时候基类虽然被派生类覆盖了 但我们实例化派生类 然后用一个基类类型的变量引用它 在调用【基类.被派生类覆盖的方法】会调用基类的方法呢?

[/Quote]

这是谁写的?我认为是错的,应该不是调用基类方法,而是调用派生类方法,你可以做个试验,
一枚小菜 2011-08-06
  • 打赏
  • 举报
回复
动态绑定,调用的时候会根据具体创建的类实例调用方法。
lihao2332 2011-08-06
  • 打赏
  • 举报
回复
要调用哪个类的方法,只要看创建实例时类的真正的类型是什么?(就是new以后的类型)因此,你的那个就是调用的newclass类的
wdl131415 2011-08-05
  • 打赏
  • 举报
回复
那我们可不可以这么想 【一个派生类相当于同时拥有了基类和派生类的所有成员,那现在用一个基类类型的变量来引用该派生类的一个实例就等于把派生类的成员全抹杀了,我觉得到这都很通,但接着我们调用那个基类的虚拟方法,结果显示的却是派生类的覆盖方法?莫名其妙了】
能给个好理解点的吗?
wdl131415 2011-08-05
  • 打赏
  • 举报
回复
额 有点蒙了 那什么时候基类虽然被派生类覆盖了 但我们实例化派生类 然后用一个基类类型的变量引用它 在调用【基类.被派生类覆盖的方法】会调用基类的方法呢?[Quote=引用 3 楼 stonespace 的回复:]
如果基类定义的方法用virtual修饰,那么调用的时候会调用实例所属的派生类的对应方法(用override修饰),

这个机制和c++一样,
[/Quote]
潘少博 2011-08-05
  • 打赏
  • 举报
回复
封装 继承 多态
这个就是多态
lele1028265767 2011-08-05
  • 打赏
  • 举报
回复
3楼正解
kattyice2 2011-08-05
  • 打赏
  • 举报
回复
不错,不错支持
stonespace 2011-08-05
  • 打赏
  • 举报
回复
如果基类定义的方法用virtual修饰,那么调用的时候会调用实例所属的派生类的对应方法(用override修饰),

这个机制和c++一样,
vrhero 2011-08-04
  • 打赏
  • 举报
回复
不要乱扯什么指针,只不过是查方法表而已...
老毕 2011-08-04
  • 打赏
  • 举报
回复
关键在于基类方法中的virtual与派生类方法中的override,这叫动态联编。
请参考MSDN:
http://msdn.microsoft.com/zh-cn/library/ebca9ah3.aspx

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧