C 虛基類問題

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

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 虛基類小問題

流星夢陽 你不要把虛函式與虛繼承弄混了,虛函式才是為了統一介面的,虛繼承是解決重複繼承的。所以一般的子類指標能自動轉換為父類指標,或引用,就像你這add函式中p一樣,new出的新物件都被自動轉換成staff型指標了。父類到子類一般是不行的,當然通過dynamic cast可以強制轉換但也不是都成功。...

c中派生類重寫基類虛函式的問題望大蝦指教

非也,子類不能直接呼叫父類的成員函式以及成員變數,如果要呼叫就必須用父類 也就是你這個函式中其實呼叫的是父類的函式,這個與虛函式沒有一點關係,僅僅是子類呼叫父類的方式而已。虛函式的價值體現是 我定義乙個子子類物件 cclientsocket ccs 假設有無參建構函式 然後我定義了乙個其他的函式 e...

C 中,虛基類是如何避免兩義性的

c 的繼承中的基類就是派生類的一個子物件,也就是說基類是派生類的一個子部分,它佔用派生類的一部分記憶體。當b類從a類派生時,b類物件中就會有sizeof a 大小的儲存空間用於儲存a類子物件。當通過b類物件來訪問a類的成員時,產生的訪問指令使用的地址是b物件的起始地址 a物件在b物件的偏移量 a成員...