C 虛擬函式語法小問題求解,一個C 虛擬函式語法小問題求解

時間 2022-10-16 13:25:05

1樓:

((aa*)(pa->fun()))->g();

改成這樣就成了。

我這是編譯的時候就出錯了。改成上邊這樣後,就能編譯過去。

我理解是這樣的:虛擬函式是執行時的狀態,類物件有虛擬函式表,而虛擬函式表是在程式執行的過程中才會有的,而這個程式是在編譯的時候就報錯了,那麼就是因為編譯器掃描原始檔,發現pa是a*型別的,而a的fun函式返回的是a*,自然就沒有g函式了。就是編譯器不負責去推測執行時fun到底返回的是什麼,因為在二進位制下,返回的是指標,這個指標可以強制轉換成任何東西的。

我說過了,你這個是編譯的時候發生的錯誤,a *pa = &aa這句話編譯器判斷pa是a*型別的。而在編譯的時候編譯器編譯pa->fun()這句話的時候首先看pa的型別是a*,而a的fun函式返回的也是a*,所以會編譯出錯。

也就是說編譯的階段和執行時的階段是不同的情況。編譯器沒法去揣測執行時的狀態的。

建議樓主看看編譯器相關的書籍和《深入理解計算機系統》

2樓:匿名使用者

首先你的問題就是虛擬函式 返回型別 引數都必須一致 你的根本就不一致 程式怎麼通過的? 還有如果返回型別一致了 你的問題就不用解釋了吧

C語言小問題,C語言一個小問題

區別 一個是指向結構體變數的指標,一個是指向整形變數的指標。詳細說明如下 struct student p指向結構體變數的指標 struct 結構體名 結構體指標變數名 執行結果 int p變成了指向整形變數的指標 編譯執行 錯誤 不同的變數型別,p並不屬於整形變數類指標。 你.是不是諶衛軍老師班上...

C語言小問題,C語言一個小問題

儘量不要使用這樣的 因為不同編譯器可能會得到不同的結果。上面是逗號運算子,從右向左進行 結果 n 先使用,即輸出1,再減1 n 這時 n 0,加1,使用,即輸出1n 先使用,即輸出1,再加1 printtf 語句結束後,n 2 c語言的輸出運算是從右向左運算的,但是輸出形式是從左往右!所以先計算n ...

C語言小問題,C語言一個小問題

這個問題的關鍵在於 if k n printf n 這句話。因為只要執行了if n j 後面的複合語句。k n一定成立。k 到k n時,不滿足k 其實去掉if k n 光保留printf n 同樣能得出上面的結果。既然你不想要最後一句的 n。那不妨這樣一改就可得到你想要的 把if k n print...