C已經在派生類中重定義了抽象類中的純虛函式,為什麼還不讓我用派生類定義物件

2021-03-27 11:53:27 字數 3983 閱讀 4678

1樓:匿名使用者

抽象類中的純虛函式為:void printarea() const但是派生類中的虛函式為:void printarea(circle &) const、void printarea(rectangle &) const、void printarea(******** &) const

這些派生類中的函式與抽象類中純虛函式只是重名,但是並不是一樣的引數,當然編譯程式並不認為派生類中重寫了這個純虛函式

更何況你的main函式中呼叫的都是這個純虛函式改的方法有很多,一種是去掉所有派生類的引數,派生類實現該函式時,就只有this可以操縱了

派生類如果繼承了抽象基類中的純虛函式,而在該派生類中沒有對此純虛函式進行定義 ......

2樓:

這應該是筆誤吧,如果派生類中沒有對基類的純虛函式進行定義,那麼派生類自身也就成了乙個抽象類,無法被例項化。如果也沒有進行宣告,那繼承下來的函式還是純虛函式。因為它明確地告訴了編譯器函式有操作名稱,但是指向無效位址。

如果在派生類中對基類的純虛函式進行了重新宣告或者定義,那麼此函式的操作指標就被指到了新的位址,如果這個新的操作位址沒有被指向0,那就不再是乙個純虛函式,派生類也就不再是抽象類。

派生類中完全實現基類中所有的的純虛函式,否則,派生類也變成了抽象類,不能例項化物件什麼意思?

3樓:匿名使用者

基類中有純虛函式,如virtual int fun() = 0;

在派生類中要實現 這個純虛函式。

如果派生類中沒有實現這個函式,那麼等於派生類中也有了,virtual int fun() = 0;

那麼派生類也變成了抽象類,不能例項化。

抽象類:有純函式的類。

4樓:匿名使用者

純虛函式就是只有宣告且=0的

派生類就是它的子類嘛,如果沒有完全實現父抽象類(完全抽象類)中的所有抽象方法(虛方法與純屬虛方法),那麼子類就成乙個抽象類。

抽象類是不能直接例項化的。

這裡的抽象意思就是不是實際的。沒有完全實現的。或者說還是半成品。

c++中由抽象類派生的類中可以定義新的純虛函式嗎

5樓:々環環々相扣

你好,這樣在c++語法中是不被允許的。所有的包含有純虛函式的類也即是抽象類必須是在基類(也稱父類)中定義,不能在派生類中再定義純虛函式。希望對你有用。。

6樓:匿名使用者

抽象類不能例項化物件。

你的三維影象類既然定義了純虛函式,就是抽象類了,不能例項化該類物件。

7樓:歌夢復興

正方體類和球類中都實現了getarea和getvolume這兩個方法嗎?

為什麼純虛函式在定義時不能等於0

8樓:匿名使用者

函式名前面加copyvirtual表示虛函式,如:virtual void a()bai;如果寫成du virtual void a()=0;就表示純虛函式,所以定義zhi純虛函式是要等於0的,dao乙個類中如果有純虛函式,那麼它不可以構建物件。

9樓:和睦空大

純虛函式是一種特殊的虛函式,它的一般格式如下:

class 《類名》

;在許多情況下,在基類中不能對虛函式給出有意義有實現,而把它說明為純虛函式,它的實現留給該基類的派生類去做。這就是純虛函式的作用。

[編輯本段]

二、引入原因

1、為了方便使用多型特性,我們常常需要在基類中定義虛函式。

2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為乙個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。

為了解決上述問題,引入了純虛函式的概念,將函式定義為純虛函式(方法:virtual returntype function()= 0;),則編譯器要求在派生類中必須予以過載以實現多型性。同時含有純虛函式的類稱為抽象類,它不能生成物件。

這樣就很好地解決了上述兩個問題。

[編輯本段]

三、相似概念

1、多型性

指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。c++支援兩種多型性:編譯時多型性,執行時多型性。

a.編譯時多型性:通過過載函式實現

b 執行時多型性:通過虛函式實現。

2、虛函式

虛函式是在基類中被宣告為virtual,並在派生類中重新定義的成員函式,可實現成員函式的動態過載

3、抽象類

包含純虛函式的類稱為抽象類。由於抽象類包含了沒有定義的純虛函式,所以不能定義抽象類的物件。

程式舉例:

基類:class a

;子類:

class b : public a

;主函式:

int main(int argc, char* argv)

f1()是乙個隱藏,關於函式的隱藏,可以參考其它詞條.

呼叫m_j->f1();會去呼叫a類中的f1(),它是在我們寫好**的時候就會定好的.

也就是根據它是由a類定義的,這樣就呼叫這個類的函式.

f2()是普通的過載.

呼叫m_j->f2();會呼叫m_j中到底儲存的物件中,對應的這個函式.這是由於new的b

物件.f3()與f2()一樣,只是在基類中不需要寫函式實現.

10樓:傲世修羅王

扯淡,不是不能等於0,而是必須等於0,趕緊回去看書吧

在c++中,虛函式可以允許在派生類中重新定義與基類的同名函式,那麼在派生類中基類的同名函式是否還存

11樓:抓狂的奶粉

還存在的

可以通過父類作用域呼叫父類的同名函式

c++中,基類是抽象類(有純虛函式),在派生類(公有繼承)中,能不能呼叫初始化基類物件?

12樓:匿名使用者

能呼叫如果創bai建物件是b b(2,3),那du麼就會執行b(int m, int n=0)這個zhi建構函式dao,進而顯式呼叫了基類a的構專造函式a(int a),因屬為初始化列表裡寫明了a(m)構造方式

假如沒有這個a(m)語句,那麼就會呼叫a的預設建構函式,但a裡沒有寫a() {},所以就會報錯:沒有適合的預設建構函式可用

有關c++中類繼承的問題想請教!

13樓:蘭魯

虛函式一定要實現函式

體,如果是純虛函式則不能例項化物件,帶有純虛函式的類為抽象類回,如果答派生類不過載該函式,則派生類也是抽象類。

虛函式在派生類中不必一定要過載,也可以呼叫基類的虛函式,前提是不是私有的。只有把基類強制轉換為派生類時,呼叫基類所沒有的函式才會出錯。

虛函式的出現可以實現多型。

c++中,純虛函式是沒有實現體的虛函式 這個選項為什麼錯?錯在哪了呢?

14樓:匿名使用者

純虛函式只是在基類沒有函式體,在其子類或者說派生類還是要有函式體的。

純虛函式是一種特殊的虛函式,在許多情況下,在基類中不能對虛函式給出有意義的實現,而把它宣告為純虛函式,它的實現留給該基類的派生類去做。這就是純虛函式的作用。

純虛函式可以讓類先具有乙個操作名稱,而沒有操作內容,讓派生類在繼承時再去具體地給出定義。凡是含有純虛函式的類叫做抽象類。這種類不能宣告物件,只是作為基類為派生類服務。

除非在派生類中完全實現基類中所有的的純虛函式,否則,派生類也變成了抽象類,不能例項化物件。

一般而言純虛函式的函式體是預設的,但是也可以給出純虛函式的函式體(此時純虛函式變為虛函式),這一點經常被人們忽視,呼叫純虛函式的方法為baseclass::virtual function.

以上是大部分是比較官方的解釋,其實就你這個題而言,個人感覺出題人有點玩文字遊戲了,因為這個選項說他對也有道理,因為在宣告的類裡確實沒有定義,當然也可以認為他是錯的,理由就是上面這些了。

c抽象類和普通類的區別,java中抽象類和介面的區別?

1.c 沒有abstract.vc提供了乙個inte ce 2.抽象類就是指不能例項化的類,因為它們包含了純虛方法。3.虛函式是在申明的時候用了關鍵字virtual的類的 非靜態 成員函式 java中抽象類和介面的區別?抽象類是用來捕捉子類的通用特性的 它不能被例項化,只能被用作子類的超類。抽象類是...

請問c中在派生類中若要訪問基類成員要使用什麼關鍵字

直接訪問就行了,若是派生類覆蓋了同名的基類成員則使用 作用域解析運算子即可,若基類的成員是私有的則派生類是無法訪問基類的成員的。示例 class a class b public a void main 如果是基類的public或protected成員,直接訪問即可 如果是private成員,則不能...

什麼關鍵字用於在C中從派生類中訪問基類的成員

base.成員名 無法訪問基類的私有 private 成員 base,可以呼叫基類的成員 請問c 中在派生類中若要訪問基類成員要使用什麼關鍵字?直接訪問就行了,若是派生類覆蓋了同名的基類成員則使用 作用域解析運算子即可,若基類的成員是私有的則派生類是無法訪問基類的成員的。示例 class a cla...