C#是否有纯虚函数

Silentdoer 江西财经大学 软件工程师  2015-07-14 10:08:11
RT,小弟以前是学C++的,里面有纯虚函数,问题:
1、貌似C++里面声明了纯虚函数的类就是C#里面的抽象类(不太记得了)?,
2、想问下C#里面有纯虚函数的说法吗?
3、有的话怎么声明呢?
4、有的话声明了纯虚函数的类称为什么类?与抽象类有何区别?
5、有的话声明了纯虚函数的类是否可以被继承?
6、若可以被继承,那该纯虚函数在子类中可以被覆盖吗,还是说必须被覆盖?
7、若在子类中该函数不是必须被覆盖,且没有覆盖,那子类是否也是抽象类?

小弟的问题可能很幼稚,但是迫切希望搞懂这些细节问题,望大家给个准确的答复,谢谢。
小弟现在在上班,可能要晚点回复大家。
...全文
1093 21 2 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
寒江独 2015-07-16
是啊哈哈还有你
  • 打赏
  • 举报
回复
ajianchina 2015-07-15
纯虚函数最大的实质意义就是制定标准,c++要把这玩意儿拿来在c#中找一模一样的东西,没办法,语言不通,但就编程思想来讲,其意义更贴近于c#中的接口。
  • 打赏
  • 举报
回复
Silentdoer 2015-07-15
现在在上班,晚上结贴,已经知道了。
  • 打赏
  • 举报
回复
Silentdoer 2015-07-15
引用 3 楼 sgyiliya 的回复:
这个,普通父类的虚方法在本父类里面可以为空没有任何代码,在子类里面也可以不实现,这就是纯虚方法。 抽象类里面可以有抽象方法和虚方法,抽象类里面的抽象方法或者虚方法可以public这样的修饰符,抽象类的抽象方法一定要在子类中写出具体的实现代码。而且,抽象类的抽象方法不能有自己的方法体,也就是不能在抽象类自己里面写出具体的实现代码。而且,抽象类里面的抽象方法在子类中也是用override来覆盖。 抽象类里面的虚方法的特点与普通父类是一致的: 抽象类里面的虚方法可以有自己的方法体吗?答:可以有。 抽象类里面的虚方法一定要在子类中override吗?答:不要求一定要实现。 抽象类只能作为父类,而且不能new自己的实例对象,但是可以把它们的子类对象赋值给抽象类的对象。 可能有疏漏错误,请高手指正。
个人认为你说的大部分是对的,但是对于“普通父类的虚方法在本父类里面可以为空没有任何代码,在子类里面也可以不实现,这就是纯虚方法。”这里面的可以为空应该是指如public virtual void Func(){}后面还是要有{},而C++中的纯虚方法是指Func()=0;这种表示形式,若是{}这种,在C++中只是没有具体功能的虚方法不叫纯虚方法;C#里面的抽象方法会更类似于C++中的纯虚方法。第二点:”抽象类的抽象方法一定要在子类中写出具体的实现代码。"应该这样表述:子类可以实现抽象父类的抽象方法,但是也可以不实现,如果子类还有没有实现的抽象父类的抽象方法(抽象类不一定只有一个抽象方法),则子类仍然为抽象类。而且子类就算实现抽象父类的抽象方法应该只需要有{}就行,而不是必须在{}中写一些具体功能;也就是说所谓实现抽象父类的抽象方法在override时有{}即可。---以上均为个人理解,如果错误望指正。
  • 打赏
  • 举报
回复
Poopaye 2015-07-15
引用 8 楼 silentdoer 的回复:
引用 7 楼 sp1234 的回复:
virtual 和 abstract 两个关键字的分开或者组合使用,要比一个“纯虚方法”更清晰和更强大。
也就是说C#没有像C++中纯虚函数的说法,但是有抽象类、抽象方法、虚方法的进一步分类?
C#中的abstract方法就是纯虚函数
  • 打赏
  • 举报
回复
Silentdoer 2015-07-15
引用 11 楼 ajianchina 的回复:
C++中定义一个函数为纯虚函数,才代表函数没有被实现,起到一个规范的作用,同时继承了这个类就必须实现这个函数。 在C#中这是什么?
C++好久没看了,对于纯虚函数,子类是否必须实现有待商榷。看13楼我的回复。
  • 打赏
  • 举报
回复
Silentdoer 2015-07-15
引用 11 楼 ajianchina 的回复:
C++中定义一个函数为纯虚函数,才代表函数没有被实现,起到一个规范的作用,同时继承了这个类就必须实现这个函数。 在C#中这是什么?
但是在C#中不是这种说法不是吗?而是将其细化了。
  • 打赏
  • 举报
回复
Silentdoer 2015-07-15
引用 9 楼 ajianchina 的回复:
[quote=引用 4 楼 silentdoer 的回复:] 对于C#里面的抽象类和虚函数和抽象函数我都有一定的了解,我现在主要想知道C#中有没有纯虚函数这一说法。
引用 5 楼 silentdoer 的回复:
我就问下大家,C#中有纯虚函数吗?其他的问题暂时不管。
原本以为你对c#里的概念弄混淆了,既然已经对相关修饰符的概念有所了解,就你讲的C#中是否有C++中的纯虚函数,就我所知,C#中没有雷同的名字,但与其作用一致的东东就是C#中的接口,Java中的接口函数跟你说的纯虚函数也是同等功能,你仔细看看C#接口的定义。http://blog.csdn.net/ajianchina/article/details/46560193[/quote] 谢谢你的回复,不过据我所知,你的第7点应该不完善,应该说子类如果实现了抽象类的所有抽象函数则不再是抽象类,否则子类仍然为抽象类,不能实例化。
  • 打赏
  • 举报
回复
qq_19289443 2015-07-15
刚刚进来,感觉好深奥
  • 打赏
  • 举报
回复
threenewbee 2015-07-14
当然有,一种变成语言只要有抽象类,必然有纯虚函数。
  • 打赏
  • 举报
回复
sgyiliya 2015-07-14
这个,普通父类的虚方法在本父类里面可以为空没有任何代码,在子类里面也可以不实现,这就是纯虚方法。 抽象类里面可以有抽象方法和虚方法,抽象类里面的抽象方法或者虚方法可以public这样的修饰符,抽象类的抽象方法一定要在子类中写出具体的实现代码。而且,抽象类的抽象方法不能有自己的方法体,也就是不能在抽象类自己里面写出具体的实现代码。而且,抽象类里面的抽象方法在子类中也是用override来覆盖。 抽象类里面的虚方法的特点与普通父类是一致的: 抽象类里面的虚方法可以有自己的方法体吗?答:可以有。 抽象类里面的虚方法一定要在子类中override吗?答:不要求一定要实现。 抽象类只能作为父类,而且不能new自己的实例对象,但是可以把它们的子类对象赋值给抽象类的对象。 可能有疏漏错误,请高手指正。
  • 打赏
  • 举报
回复
ajianchina 2015-07-14
C++中定义一个函数为纯虚函数,才代表函数没有被实现,起到一个规范的作用,同时继承了这个类就必须实现这个函数。 在C#中这是什么?
  • 打赏
  • 举报
回复
exception92 2015-07-14
首先,什么是 “纯虚函数”,坐等大神回复。
  • 打赏
  • 举报
回复
moonwrite 2015-07-14
1、貌似C++里面声明了纯虚函数的类就是C#里面的抽象类(不太记得了)?, 是的,抽象类里面的抽象方法 2、想问下C#里面有纯虚函数的说法吗? 没有,就是抽象方法 3、有的话怎么声明呢? abstract 4、有的话声明了纯虚函数的类称为什么类?与抽象类有何区别? C++ 函数可以独立存在,C#是面向对象语言~~必须是类的成员, 所有有抽象方法,抽象类 5、有的话声明了纯虚函数的类是否可以被继承? 就是为了继承,多态的 6、若可以被继承,那该纯虚函数在子类中可以被覆盖吗,还是说必须被覆盖? 就是为了覆盖,多态 7、若在子类中该函数不是必须被覆盖,且没有覆盖,那子类是否也是抽象类? 子类必须实现抽象类的抽象方法
  • 打赏
  • 举报
回复
ajianchina 2015-07-14
你这问题接下来就会涉及到c#中virtual方法与abstract方法混淆,给你一步到位,你看看这篇文章的介绍 http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html
  • 打赏
  • 举报
回复
ajianchina 2015-07-14
引用 4 楼 silentdoer 的回复:
对于C#里面的抽象类和虚函数和抽象函数我都有一定的了解,我现在主要想知道C#中有没有纯虚函数这一说法。
引用 5 楼 silentdoer 的回复:
我就问下大家,C#中有纯虚函数吗?其他的问题暂时不管。
原本以为你对c#里的概念弄混淆了,既然已经对相关修饰符的概念有所了解,就你讲的C#中是否有C++中的纯虚函数,就我所知,C#中没有雷同的名字,但与其作用一致的东东就是C#中的接口,Java中的接口函数跟你说的纯虚函数也是同等功能,你仔细看看C#接口的定义。http://blog.csdn.net/ajianchina/article/details/46560193
  • 打赏
  • 举报
回复
Silentdoer 2015-07-14
引用 7 楼 sp1234 的回复:
virtual 和 abstract 两个关键字的分开或者组合使用,要比一个“纯虚方法”更清晰和更强大。
也就是说C#没有像C++中纯虚函数的说法,但是有抽象类、抽象方法、虚方法的进一步分类?
  • 打赏
  • 举报
回复
virtual 和 abstract 两个关键字的分开或者组合使用,要比一个“纯虚方法”更清晰和更强大。
  • 打赏
  • 举报
回复
virsual 和 abstract 两个关键字的分开或者组合使用,要比一个“纯虚方法”更清晰和更强大。
  • 打赏
  • 举报
回复
Silentdoer 2015-07-14
我就问下大家,C#中有纯虚函数吗?其他的问题暂时不管。
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
非技术区
创建于2007-09-28

7710

社区成员

.NET技术 非技术区
申请成为版主
帖子事件
创建了帖子
2015-07-14 10:08
社区公告
暂无公告