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...