为什么要用虚函数,仅仅是为了子类可以重写它吗?不是虚函数我也可以重写它呀?派生类中和基类中有同签名函数,通过派生类对象访问这个函数时,应该优先执行派生类的函数,如果派生类没有这个函数才去执行基类中这个同名函数(公有继承时)。

zcdg909 2008-09-18 06:56:14
为什么要用虚函数,仅仅是为了子类可以重写它吗?不是虚函数我也可以重写它呀?派生类中和基类中有同签名函数,通过派生类对象访问这个函数时,应该优先执行派生类的函数,如果派生类没有这个函数才去执行基类中这个同名函数(公有继承时)。
...全文
928 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kokialoves 2010-06-09
  • 打赏
  • 举报
回复
什么多态,什么鸟啊狗啊,编程是对内存操作吧?敢从内存角度讲不?敢吧WINDOWS帮你干的事情也说出来不?我怎么就跟听天书似的?
qrh2008 2008-12-09
  • 打赏
  • 举报
回复
可能大家没理解楼主的意思 我觉得声明它是虚函数 是为了他可以重写 从而实现多态 只有当父类的方法是virtual或者abstract时 子类才可以用override重写。
CsToD 2008-09-19
  • 打赏
  • 举报
回复
给你个最简单的例子:
namespace Some
{
class My
{
//Method1
public new string ToString()
{
return "MyString();
}

//Method2
// public override string ToString()
// {
// return "MyString";
// }
}
}

My my=new My();
Console.Write(my);
用Method1,你以为会输出什么?MyString?
会输出Some.My

只有Method2会输出MyString


为什么?

显然,肯定不存在Console.Write(My)方法 //系统定义这个方法时,根本不知道My的存在
你调用的其实是:Console.Write(object)方法
换句话说,其实是这样:
My my=new My();
object obj=my;
Console.Write(obj);
现在知道了吧,虽然是子类的对象,但是是由基类的引用来引用的,你如果不用override来重写,系统根本不可能去调用你定义的方法,而是去调用在object中定义的ToString方法,于是输出了类名


这么简单一个语法问题,标题还N长,好像在对全世界示威似的,你以为你谁啊!

结贴率不到1/10,这种人应该被封杀!
huangyonghua 2008-09-18
  • 打赏
  • 举报
回复
这个嘛是一个多态的问题,你看看多态的内容就知道了。
bobo202020 2008-09-18
  • 打赏
  • 举报
回复
书本上全是那些猫啊 狗啊 的类实现多态
看起来是很难懂,也觉得这么简单的一个类 还去这样折腾,太烦琐了
但在现实开发中,就不是猫猫狗狗的
它就是别人写好的一个强大的类
你把它做基础,去写东西
我上面说了,比如微软提供的很多很多的类
bobo202020 2008-09-18
  • 打赏
  • 举报
回复
给你一个简单易懂回复
如果你一个类要继承DataGridView类
但你有点特殊要求,本身DataGridView类并没有实现
你就重写他的虚方法了 比如说在DataGridView里面按回车是向右走,
而不是默认的往下走,还有很多很多了

如果按照你题目的意思,妈的,我干吗去重写虚方法啊
我自己写个DataGridView不就可以了吗
当然,如果你有这么的厉害,完全可以,呵呵

重写虚方法,主要用途还是继承一个实现好的基类
然后基类中有些方法的功能并不是你想要的

在实际开发当中
如果所有的方法所有的类都是你自己一手创造的
你完全没必要去继承,去重写
妈的,搞那么麻烦干什么,还容易把自己搞晕
我直接复制过来 不就可以了吗 完全可以,而且这样比较好点
正因为这样 ,书本上一些理论 才让我们感到迷惑
特别是没开发过东西的朋友,感觉很多东西不这样也可以,其实不然。

问题是,在现实开发当中你用的大多数东西,还都是微软现成提供的
比如控件类,这些类中有些方法未必你是要的效果
你就要用到重写虚方法了

写的累,听明白了,就给分啊,别装B, 呵呵!
CsToD 2008-09-18
  • 打赏
  • 举报
回复
揭贴率:8.02%
ProjectDD 2008-09-18
  • 打赏
  • 举报
回复
问题是:

public class A
{
public virtual void TestM1()
{
MessageBox.Show("A.TestM1");
}
public virtual void TestM2()
{
MessageBox.Show("A.TestM2");
}
}

public class B: A
{
public override void TestM1()
{
MessageBox.Show("B.TestM1");
}
public new void TestM2()
{
MessageBox.Show("B.TestM2");
}
}

public class App
{
A a = new B();
public void Test()
{
a.TestM1();
a.TestM2();
}
}


结果: B.TestM1
A.TestM2

参考看法:
很多时候子类override是为了基类使用时可以有灵活的构造配置,(多态)使用方总是基类对象
所以如果子类有它自己的成员(包括new的成员函数在内)是无法被其调用的,那些不能为调用方
提供调用的成员对于调用方来说是没有意义的,这也从一个方面回答了override不能被new代替的
原因;
abcyzq 2008-09-18
  • 打赏
  • 举报
回复
白天都给你解释了多态的问题,又不给分,这个不给你解释了

110,545

社区成员

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

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

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