1樓:匿名使用者
對虛擬函式來說,其實際呼叫的函式要根據呼叫者實際的型別來決定呼叫那一個函式。這個具體呼叫哪一個是在執行的時候去決定的,程式設計的時候不需要指明。pb->b::
fa(); 這一句裡你就是要指明pb去呼叫b類的成員函式fa(),而pb是一個a型別的物件指標,這當然是不行的了。
換句話來說:pb->fa(),這裡面呼叫的實際上就是b類的fa(),但是這一點系統執行的時候可以這麼幹,但是由你指出來讓他這麼幹,指明要它去呼叫b類的fa()還就是不允許。
2樓:匿名使用者
gcc 4.3.2 編譯器
a.cpp:29: error: 'b' is not a base of 'a'
b 不是 a 的基類.
我的分析:
a 一個小環境
b 一箇中環境,b含了a
a *pa=new a;
a *pb=new b;
上面兩句分別把 a 和 b 聲名成了a物件。
既然是a物件,那麼就要使用a環境,也就是說,pa和pb的空間是a(可以參考名稱空間,空間的意思差不多)在a的類空間中,是不包含b類空間的。所以找不到。 上面整個過程 和b類空間沒有任何關係。
a *pb = new b; 只是讓一個a指標指向b結構。a和b中的變數、函式的位置相對於 a這個struct來說,都是對應的,a中存在一個叫fa的函式指標,b中也存在,而且b中的這個fa指標和a中的位置還是相同的呢。 所以 pb.
fa 可以正確找到b環境中的fa函式。 而pb->a::fa(); 這樣就要從pb的a子環境中尋找fa函式,由於這個pb並不是真實的a,它其實是b,它有這個子環境,那麼就可以找到pb中a子環境中的fa。
但要知道此時,pb就是被強制當作a的b,它們許多指標的排列結構相同,所以可以強制。如果是 pb->b::fa(); 那就找不到了,pb是一個混亂的東西,它雖然是a結構,但是它超出a結構大小的部分卻是不規則的,裡面又包含了一個a結構。
pb它的主結構就是b,裡面不包含b這個子結構了,所以也就出錯了。
3樓:匿名使用者
很複雜嗎難道?
簡單說,就是編譯器不允許基類去(無論顯式還是隱式)呼叫派生類的成員!能夠多型是因為有虛擬函式表!
理由很簡單:基類不知道是誰派生的它,它不認識b!
4樓:匿名使用者
呵呵,好亂呀~我不懂哦,偶是小屁孩,什麼虛擬函式,偶都不知道啥米意思嘛……
請Excel函式高手解答問題,請Excel函式高手解答1個問題
6 0 1 row 1 9 10 9 row 1 9 0,rept 0 6 0 a6 1,12 注 公式以ctrl shift 回車結束。a4單元格里有兩個數...
二元函式重極限存在性問題,求解答
墨汁諾 不是不能用這個不等式,是用了這個不等式之後,仍然無法求出極限。令y kx代入,求得的極限是k的函式,與k有關,k取不同值極限不同,所以極限不存在。因為y kx只是yx同時趨於零的一種特殊情況,極限存在要求,yx以任何方式趨於0,極限存在且相等才可。例如 得 f x,y sin 1 x 顯然有...
生物高手幫忙解答,生物問題,請高手詳細解答。
1.是含量小於也就是萬分之一 的元素,稱為微量元素。2.對與植物來說應該是纖維素,也就是多糖 是乾重的,水應該很少的 3.纖維素 植物 蛋白質 動物 蛋白質 蛋白質。4.具有完整的細胞器,細胞器都有獨特的功能。5.因為mrna是大分子,所以不能穿過核膜,而是從核膜上的核孔出來,核孔是沒有膜的。mrn...