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

2021-05-14 10:29:08 字數 1127 閱讀 9461

1樓:

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

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

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

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

在附上例子吧!

class shape

class circle: public shape

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

}class rectangle: public shape

}int main()

只是大概意思,供參考。

2樓:

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

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

3樓:匿名使用者

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

比如類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了。這是物件導向思想的一個體現

C 基類指標指向派生類指標時,指標可以用派生類的非虛方法嗎

需要知道一些常識,一個類所有的函式都是再code 區中唯一的存放一份。而資料成員則是每個物件儲存一份,並按照宣告順序依次存放。類a中有了虛擬函式就會再類的資料成員的最前面新增一個vfptr指標 void vfptr 這個指標用來指向一個vtable表 一個函式指標陣列 一個類只有一個該表 該表儲存著...

派生類可以呼叫基類的私有成員嗎,派生類能否直接訪問基類的私有成員若不能,應如何實現

派生類不bai能對基類 私du有成員進行訪問。要在派生類zhi 中對基dao類成員回進行訪問,可以 1,在答派生類中對基類成員的public屬性進行訪問,以間接訪問基類的私有成員 2,在基類中將私有成員定義為protected訪問屬性,以在派生類中直接對其進行訪問。當位於類成員列表之前時,priva...

C 類的公有繼承,基類的私有成員在派生類中不可見或不可訪問

在c 語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱為單繼承 從多個基類派生的繼承稱為多繼承。方式如下 公有繼承 public 私有繼承 private 保護繼承 protected 是常用的三種繼承方式。1.公有繼承 public 公有繼承的特點是基類的公有成員...