C#是否有純虛函數


RT,小弟以前是學C++的,里面有純虛函數,問題:
1、貌似C++里面聲明了純虛函數的類就是C#里面的抽象類(不太記得了)?,
2、想問下C#里面有純虛函數的說法嗎?
3、有的話怎么聲明呢?
4、有的話聲明了純虛函數的類稱為什么類?與抽象類有何區別?
5、有的話聲明了純虛函數的類是否可以被繼承?
6、若可以被繼承,那該純虛函數在子類中可以被覆蓋嗎,還是說必須被覆蓋?
7、若在子類中該函數不是必須被覆蓋,且沒有覆蓋,那子類是否也是抽象類?

小弟的問題可能很幼稚,但是迫切希望搞懂這些細節問題,望大家給個准確的答復,謝謝。
小弟現在在上班,可能要晚點回復大家。

21 个解决方案

#1


你這問題接下來就會涉及到c#中virtual方法與abstract方法混淆,給你一步到位,你看看這篇文章的介紹
http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html

#2


首先,什么是  “純虛函數”,坐等大神回復。

#3


這個,普通父類的虛方法在本父類里面可以為空沒有任何代碼,在子類里面也可以不實現,這就是純虛方法。

抽象類里面可以有抽象方法和虛方法,抽象類里面的抽象方法或者虛方法可以public這樣的修飾符,抽象類的抽象方法一定要在子類中寫出具體的實現代碼。而且,抽象類的抽象方法不能有自己的方法體,也就是不能在抽象類自己里面寫出具體的實現代碼。而且,抽象類里面的抽象方法在子類中也是用override來覆蓋。

抽象類里面的虛方法的特點與普通父類是一致的:
抽象類里面的虛方法可以有自己的方法體嗎?答:可以有。
抽象類里面的虛方法一定要在子類中override嗎?答:不要求一定要實現。

抽象類只能作為父類,而且不能new自己的實例對象,但是可以把它們的子類對象賦值給抽象類的對象。


可能有疏漏錯誤,請高手指正。

#4


引用 樓主 silentdoer 的回復:
RT,小弟以前是學C++的,里面有純虛函數,問題:
1、貌似C++里面聲明了純虛函數的類就是C#里面的抽象類(不太記得了)?,
2、想問下C#里面有純虛函數的說法嗎?
3、有的話怎么聲明呢?
4、有的話聲明了純虛函數的類稱為什么類?與抽象類有何區別?
5、有的話聲明了純虛函數的類是否可以被繼承?
6、若可以被繼承,那該純虛函數在子類中可以被覆蓋嗎,還是說必須被覆蓋?
7、若在子類中該函數不是必須被覆蓋,且沒有覆蓋,那子類是否也是抽象類?

小弟的問題可能很幼稚,但是迫切希望搞懂這些細節問題,望大家給個准確的答復,謝謝。
小弟現在在上班,可能要晚點回復大家。

您好,對於C#里面的抽象類和虛函數和抽象函數我都有一定的了解,我現在主要想知道C#中有沒有純虛函數這一說法。

#5


我就問下大家,C#中有純虛函數嗎?其他的問題暫時不管。

#6


virsual 和 abstract 兩個關鍵字的分開或者組合使用,要比一個“純虛方法”更清晰和更強大。

#7


virtual 和 abstract 兩個關鍵字的分開或者組合使用,要比一個“純虛方法”更清晰和更強大。

#8


引用 7 樓 sp1234 的回復:
virtual 和 abstract 兩個關鍵字的分開或者組合使用,要比一個“純虛方法”更清晰和更強大。
也就是說C#沒有像C++中純虛函數的說法,但是有抽象類、抽象方法、虛方法的進一步分類?

#9


引用 4 樓 silentdoer 的回復:
對於C#里面的抽象類和虛函數和抽象函數我都有一定的了解,我現在主要想知道C#中有沒有純虛函數這一說法。

引用 5 樓 silentdoer 的回復:
我就問下大家,C#中有純虛函數嗎?其他的問題暫時不管。

原本以為你對c#里的概念弄混淆了,既然已經對相關修飾符的概念有所了解,就你講的C#中是否有C++中的純虛函數,就我所知,C#中沒有雷同的名字,但與其作用一致的東東就是C#中的接口,Java中的接口函數跟你說的純虛函數也是同等功能,你仔細看看C#接口的定義。http://blog.csdn.net/ajianchina/article/details/46560193

#10


1、貌似C++里面聲明了純虛函數的類就是C#里面的抽象類(不太記得了)?,
是的,抽象類里面的抽象方法

2、想問下C#里面有純虛函數的說法嗎?
沒有,就是抽象方法
3、有的話怎么聲明呢?
abstract 

4、有的話聲明了純虛函數的類稱為什么類?與抽象類有何區別?
C++ 函數可以獨立存在,C#是面向對象語言~~必須是類的成員,
所有有抽象方法,抽象類

5、有的話聲明了純虛函數的類是否可以被繼承?
就是為了繼承,多態的

6、若可以被繼承,那該純虛函數在子類中可以被覆蓋嗎,還是說必須被覆蓋?
就是為了覆蓋,多態

7、若在子類中該函數不是必須被覆蓋,且沒有覆蓋,那子類是否也是抽象類?
子類必須實現抽象類的抽象方法

#11


C++中定義一個函數為純虛函數,才代表函數沒有被實現,起到一個規范的作用,同時繼承了這個類就必須實現這個函數。

在C#中這是什么?

#12


當然有,一種變成語言只要有抽象類,必然有純虛函數。

#13


引用 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

謝謝你的回復,不過據我所知,你的第7點應該不完善,應該說子類如果實現了抽象類的所有抽象函數則不再是抽象類,否則子類仍然為抽象類,不能實例化。

#14


引用 11 樓 ajianchina 的回復:
C++中定義一個函數為純虛函數,才代表函數沒有被實現,起到一個規范的作用,同時繼承了這個類就必須實現這個函數。

在C#中這是什么?

但是在C#中不是這種說法不是嗎?而是將其細化了。

#15


引用 11 樓 ajianchina 的回復:
C++中定義一個函數為純虛函數,才代表函數沒有被實現,起到一個規范的作用,同時繼承了這個類就必須實現這個函數。

在C#中這是什么?
C++好久沒看了,對於純虛函數,子類是否必須實現有待商榷。看13樓我的回復。

#16


引用 8 樓 silentdoer 的回復:
Quote: 引用 7 樓 sp1234 的回復:

virtual 和 abstract 兩個關鍵字的分開或者組合使用,要比一個“純虛方法”更清晰和更強大。
也就是說C#沒有像C++中純虛函數的說法,但是有抽象類、抽象方法、虛方法的進一步分類?

C#中的abstract方法就是純虛函數

#17


引用 3 樓 sgyiliya 的回復:
這個,普通父類的虛方法在本父類里面可以為空沒有任何代碼,在子類里面也可以不實現,這就是純虛方法。
抽象類里面可以有抽象方法和虛方法,抽象類里面的抽象方法或者虛方法可以public這樣的修飾符,抽象類的抽象方法一定要在子類中寫出具體的實現代碼。而且,抽象類的抽象方法不能有自己的方法體,也就是不能在抽象類自己里面寫出具體的實現代碼。而且,抽象類里面的抽象方法在子類中也是用override來覆蓋。
抽象類里面的虛方法的特點與普通父類是一致的:
抽象類里面的虛方法可以有自己的方法體嗎?答:可以有。
抽象類里面的虛方法一定要在子類中override嗎?答:不要求一定要實現。
抽象類只能作為父類,而且不能new自己的實例對象,但是可以把它們的子類對象賦值給抽象類的對象。
可能有疏漏錯誤,請高手指正。

個人認為你說的大部分是對的,但是對於“普通父類的虛方法在本父類里面可以為空沒有任何代碼,在子類里面也可以不實現,這就是純虛方法。”這里面的可以為空應該是指如public virtual void Func(){}后面還是要有{},而C++中的純虛方法是指Func()=0;這種表示形式,若是{}這種,在C++中只是沒有具體功能的虛方法不叫純虛方法;C#里面的抽象方法會更類似於C++中的純虛方法。第二點:”抽象類的抽象方法一定要在子類中寫出具體的實現代碼。"應該這樣表述:子類可以實現抽象父類的抽象方法,但是也可以不實現,如果子類還有沒有實現的抽象父類的抽象方法(抽象類不一定只有一個抽象方法),則子類仍然為抽象類。而且子類就算實現抽象父類的抽象方法應該只需要有{}就行,而不是必須在{}中寫一些具體功能;也就是說所謂實現抽象父類的抽象方法在override時有{}即可。---以上均為個人理解,如果錯誤望指正。

#18


現在在上班,晚上結貼,已經知道了。

#19


純虛函數最大的實質意義就是制定標准,c++要把這玩意兒拿來在c#中找一模一樣的東西,沒辦法,語言不通,但就編程思想來講,其意義更貼近於c#中的接口。

#20


剛剛進來,感覺好深奧

#21


是啊哈哈還有你

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com