C 虛基類問題

時間 2021-08-30 10:08:18

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中虛擬函式的問題

然後去遠足 1 題主犯了很低階的錯誤 class1 cd new class1 b cd1 new b console.writeline cd.fuc 1 輸出的是 cd 物件的 fuc 方法,cd 物件是 class1 型別,結果是 1 是完全正確的。2 不 override 的這種寫法叫做 隱...

C 純虛擬函式的C 純虛擬函式,C 中純虛擬函式有什麼作用

我愛你罁 純虛擬函式是在基類中宣告的虛擬函式,它可以在基類中有定義,而且派生類必須定義自己的實現方法。基類不能生成物件,可以使用指標或者引用派生類物件。基類不在基類中實現純虛擬函式的方法是在函式原型後加 0 virtual void funtion1 0 1 為了方便使用多型特性,我們常常需要在基類...

關於C 類的問題。。急,關於C 類别範本的問題。。急

過載錯誤,不能區別2個過載函式 templateconst t array operator size t index const 加上const就能區別了 給你個例子 include using namespace std class a void fun int b void fun int b...