c 基類指標指向派生類時可呼叫派生類中定義的函式嗎

時間 2021-09-17 08:23:57

1樓:匿名使用者

這種現象在c-free中執行沒有錯誤,請問是怎麼回事? 重新定義指是在基類指標指向派生類,存的是派生類的地址,所以你強制轉換一下指標型別,基類

2樓:灰晞鬱

你說的「派生類中定義的函式」我做兩種理解:

第一種 派生類中自己寫的、基類中沒有的函式。

這種函式是基類的指標無法訪問的,必須把基類的指標通過強制型別轉換,轉化為派生類才可以訪問。

第二種 派生類中對積累中重定義的函式。

派生類中的這種函式如果想被基類的指標訪問,則必須通過虛擬函式機制,否則只能訪問到基類中的函式。

將想訪問到的函式(比如void f ())在a中定義為虛擬函式(寫成virtual void f ()),則執行(多謝sunader1大神指正)時進行動態繫結,基類的指標就能指向派生類中對基類重定義的函式了。

3樓:紫月居士

可以。比如

#include

using namespace std;

class shape;

};class circle:public shape};int main()

4樓:匿名使用者

可以,基類中定義定義該函式的虛擬函式virtual即可。也就是c++的多型性。

5樓:

只有當該派生類函式為虛擬函式時才可以,否則會出現靜態解析

6樓:匿名使用者

你把set的引數包裝下,比如像下面這樣:

#include

using namespace std;

struct param;

struct circleparam:public param;

class point

; class circle:public point

7樓:彩彩彈珠

你想問的是虛擬函式??不知道你要問的是什麼……

c++中基類指標指向派生類時,呼叫的虛擬函式是派生類的,為什麼要這樣啊?

8樓:

直接用子類物件呼叫函式當然沒問題,基類指標指向派生類物件是多型性的體現。

什麼是多型呢?多型就是不同物件接受相同的訊息,但是卻產生不同的行為,舉一個很簡單的例子,有一個圖形類,他有幾個派生類,如圓形,三角形,矩形。圖形類有一個函式area();用來求面積,但是由於不同圖形求面積的方法不同,要由具體的派生類來決定,所以可以把它定義為一個虛擬函式,由派生類來過載這個函式,所以不同的派生類裡面area()函式的函式體是不同的,

建立一個基類指標*p,讓他指向不同的派生類物件,p在呼叫area()方法時,就會呼叫派生類的area()方法了。

多型的一個好處就是提高了**的重用性,如果圖形類又有一個新的派生類五邊形,要求他的面積只需要把剛才的p指標再指向一個五邊形物件,而其他的**無需任何更改!

在附上例子吧!

class shape

class circle: public shape

}class ********: public shape

}class rectangle: public shape

}int main()

只是大概意思,供參考。

9樓:

虛擬函式的作用是: 在呼叫函式時再確定呼叫哪個物件的函式.

如果物件是被初始化為子類的, 就呼叫子類的函式; 如果物件是被初始化為父類的, 就呼叫父類的函式.

10樓:匿名使用者

直接用派生類的物件是可以的。但是虛擬函式的作用體現在多型上。

比如類a是個基類,類b,c,d由類a繼承。

現在我要寫個函式func1,對bcd三個類的物件都通用,函式內部呼叫bcd三個類都有的一個函式func2。

但是bcd三個類是不同的類,那麼這個函式可能就要過載三次,寫成func1(b b);

func1(c c);

func1(d d);

這樣才能區分傳進去的是哪個類的物件在呼叫func2,這樣在繼承得多了的時候顯得很麻煩。虛擬函式多型就可以解決這樣的問題。

把func2在類a中定義成虛擬函式,然後只要寫一個func1func1(a *a);

此時傳b *b,c *c,d *d三個指標物件進去,都可以相應的呼叫各自的func2了。這是物件導向思想的一個體現

派生類可以呼叫基類的私有成員嗎?

11樓:py彭彭

派生類不bai能對基類

私du有成員進行訪問。

要在派生類zhi

中對基dao類成員回進行訪問,可以:    1,在答派生類中對基類成員的public屬性進行訪問,以間接訪問基類的私有成員;    2,在基類中將私有成員定義為protected訪問屬性,以在派生類中直接對其進行訪問。

當位於類成員列表之前時,private 關鍵字指定這些成員僅可從成員函式和該類的友元中進行訪問。這適用於宣告到下一個訪問指示符或類的末尾的所有成員。

當位於基類的名稱之前時,private 關鍵字指定基類的公共成員和受保護成員為派生類的私有成員。類中成員的預設訪問是私有的。結構或聯合中成員的預設訪問是公共的。

基類的預設訪問對於類是私有的,而對於結構是公共的。 聯合不能具有基類。

c++中基類指標指向派生類物件可以呼叫派生類的新增成員麼

12樓:匿名使用者

no!基類指bai針告訴du

編譯器它的靜態類zhi型是基類這種型別dao,所以限定了這個指標回只能呼叫基類的自有

答成員。這個其實無關於他指向什麼型別物件。

但是,你作為這個指標的寫作者,你當然知道這個基類指標指向的是派生類物件。所以,可以將這個基類指標強制轉換為派生類指標(就是強制編譯器把這個指標靜態型別看作派生型別),靜態型別表明了一個物件 能執行的所有動作(成員函式)+它的自有屬性(資料成員),這樣派生類的新增成員就可以被這個指標呼叫了

動態繫結的重寫基類的virtual方法並不是派生類新增成員,而是重寫(override)。

13樓:欲動精靈

可以 其實這就是動態繫結嘛

該指標所繫結的物件就是派生類物件,它當然可以呼叫派生類的所有公有介面

基類指標可以指向一個派生類,然後呼叫派生類裡的函式嗎

14樓:匿名使用者

基類指標與派生類指標的相互轉換

1,直接用基類指標引用基類物件

2,直接用派生類指標引用派生類物件

3,用基類指標引用一個派生類物件,由於派生類物件也是基類的物件,所以這種引用是安全的,

但是隻能引用基類成員。若試圖通過基類指標引用那些只在派生類中才有的成員,編譯器會報告語法錯誤。(解決該問題的答案是虛擬函式和多型性)

c++為何無法用指標引用這些派生類成員函式

15樓:育知同創教育

參考下面**

#include

using namespace std;

struct param;

struct circleparam:public param;

class point

virtual void print()

c++ 派生類指標指向基類物件

16樓:匿名使用者

需要知道一些常識,一個類所有的函式都是再code**區中唯一的存放一份。而資料成員則是每個物件儲存一份,並按照宣告順序依次存放。

類a中有了虛擬函式就會再類的資料成員的最前面新增一個vfptr指標(void** vfptr),這個指標用來指向一個vtable表(一個函式指標陣列)(一個類只有一個該表),該表儲存著當前類的所有 虛擬函式 的地址。這樣vfptr就成為了一個類似成員變數的存在。訪問虛擬函式的時候通過vfptr間址找到vtable表,再間址進而找到要呼叫的函式。

這樣就在一定程度上擺脫了型別制約。

只要vptr的值不同,那麼訪問函式成員的時候使用的vtable表就不同,就可能訪問到不同類的函式成員。b類物件中的vptr指向b類自己的vtable。

當b類繼承a類的時候,因為a中有虛擬函式,編譯器就自動的給b類新增vfprt指標和vtable表。也可以理解為b類繼承來了a類中的那個vptr指標成員。

當a類指標指向b類物件時,發生假切割。要知道這個過程只是切掉a類中沒有的那些成員,由於vptr是從a類中繼承來的,所以這個量仍將保留。而對於vptr的值則不會改變,仍然指向b類的vtable表。

所以訪問f1函式的時候是通過b類的vtable表去定址的,自然就是使用子類的函式。

當b類的指標指向a類的物件時(當b類存在新增資料成員時可能出錯),同理。

而對於普通函式則受型別的制約,(因為沒有vptr指標)使用哪個類的指標呼叫函式,那麼所呼叫的就是那個累的函式。

總而言之,普通函式通過物件或指標的型別來找所呼叫的函式,而虛擬函式是通過一個指標來找到所要呼叫的函式的。

17樓:

如果派生類新增了另外的虛擬函式則父類物件不會擁有派生類物件額外定義的虛擬函式指標,呼叫結果不確定,最大的可能是程式崩潰!

18樓:匿名使用者

如果基類宣告的是虛擬函式就呼叫基類的,如果不是虛擬函式並在派生類中實現,就呼叫派生類的函式

這就是虛擬函式的作用

C 中繼承基類和派生類的關係,比如繼承方式,子類是不是至少擁有全部父類成員函式

子類是擁有全部類的成員函式,但是訪問的許可權就看父類的訪問修飾符 public,protected,private 子類要想訪問父類的資料成員,該資料的訪問許可權必須是public或者protected,public訪問 許可權最低,protected只能是自身類的成員函式,友元類與子類訪問,pri...

在c 中為什麼基類不預設構造時候派生類要呼叫基類建構函式進行初始化

派生類的建構函式必須呼叫基類的建構函式,這是c 的內部規定。這樣派生類的實現可以專注於自己本身,不用考慮基類的事。而且,在實際使用時,你根本就不知道大部分基類的實現細節,你只要做好自己派生類的事就行了。比如你用vc,直接建立一個對話方塊類,你不需要知道對話方塊類是怎麼生成並顯示的,你只要寫你額外需要...

C 中,為什麼派生類的建構函式如果沒有提供基類的初始化器

a774888179巨蟹 c 中成員變數的初始化是在進入建構函式體之前的,如果你需要初始化一個派生類物件,先會呼叫基類的建構函式,然後為初始化列表中的派生類成員變數進行初始化,如果你的部分或全部的成員變數選擇在函式體內賦值,那麼編譯器會先為這些成員變數進行預設的初始化 呼叫其預設建構函式 然後使用c...