C 虛基類問題

2021-08-22 10:13:01 字數 1284 閱讀 8237

1樓:

首先...這個不叫虛基類

這只是一個普通繼承

基類裡面有一個虛擬函式

定義a *p= new c;

p是一個a型別的指標,但實際上p指向的是一個c型別(c型別也是a型別的一種,c繼承自a)

p->show ();的時候,因為a中的是 virtual show 即虛擬函式 所以會執行c的show()函式

這就是虛擬函式的一個典型應用

在c中 show 是 private的 顯然直接呼叫是會出錯的但是a中的show 是public

定義的指標p 為a型 p->show()的show()實際上執行時找到的是a中的show函式,但實際的內容卻是c的show,多型!

另 new 完之後要delete

2樓:匿名使用者

使用指標的話,由於a中show是public的,所以通過指標可以訪問,同時show是虛擬函式,有多型的特性,因此最終呼叫到c的show函式。如果使用物件的話,編譯器在只會在c中找public 的show函式,找不到自然報錯

3樓:匿名使用者

指標和引用均可以

如下:#include

class a

};class b: public a

};class c: public a

};void main()

4樓:匿名使用者

3樓回答得不錯,但我估計你還是有點疑問。類的訪問屬性限制在編譯期間(靜態聯編)有效,你通過物件c呼叫私有的show編譯期間肯定會報錯的。動態聯編是指系統在執行時動態實現某一個動作,在編譯期間,通過基類型別的引用或者指標呼叫函式時,編譯器將在基類中查詢函式而忽略派生類(c++primer第四版501頁),所以你應該理解為什麼虛擬函式原型基類和派生類中要一致了吧。

這裡,p在編譯期間呼叫基類裡的show是沒有問題的。並且這裡的show是虛擬函式,編譯器根據物件的動態型別執行相應函式版本。在執行期間,類的訪問屬性限制已經不起作用了。

不一定正確,歡迎大蝦指正。

5樓:刑懷雨鞠卯

虛基類是相對於它的派生類而言的,它本身可以是一個普通的類。

只有它的派生類虛繼承它的時候,它才稱作虛基類,如果沒有虛繼承的話,就稱為基類。比如類b虛繼承於類a,那類a就稱作類b的虛基類,如果沒有虛繼承,那類b就只是類a的基類。

虛繼承主要用於一個類繼承多個類的情況,避免重複繼承同一個類兩次或多次。

例如由類a派生類b和類c,類d又同時繼承類b和類c,這時候類d就要用虛繼承的方式避免重複繼承類a兩次。

c定義虛基類Shape,在Shape類的基礎上

include using namespace std class shape void shape createshape class rectangle virtual public shape rectangle rectangle float a,float b float rectangl...

C 中抽象類和虛基類用途上有什麼區別

語法上有抽象類和虛基類,不等於你一定要用它。花裡胡哨的東西,我通常不用。我能想到的抽象類用處,大概這個優點可以用一用 含有純虛擬函式的類都是抽象類。基類中實際上並不使用這個函式,它只是通知編譯系統 在這裡宣告一個虛擬函式,留待在派生類中定義。為一個類族提供一個公共介面。例如,計算平面形狀的面積,抽象...

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

直接用子類物件呼叫函式當然沒問題,基類指標指向派生類物件是多型性的體現。什麼是多型呢?多型就是不同物件接受相同的訊息,但是卻產生不同的行為,舉一個很簡單的例子,有一個圖形類,他有幾個派生類,如圓形,三角形,矩形。圖形類有一個函式area 用來求面積,但是由於不同圖形求面積的方法不同,要由具體的派生類...