虛擬函數預設參數行為
在提供的C 程式碼中,虛擬函數重載和預設參數出現了一種奇怪的情況。讓我們探討這個問題並了解底層機制。
代碼定義了兩個類,B 和D,其中B 有一個預設參數為10 的虛擬列印方法,D 則使用不同的預設參數20 覆蓋print當透過指向D類型物件的B類型指針呼叫print時,未獲得“D--data=20”的預期輸出。相反,輸出顯示“D--data=10”。
根據 C 標準 (8.3.6.10),虛擬函數呼叫使用由指標或引用的靜態決定的聲明中定義的預設參數類型。這意味著當透過 B 指標呼叫 print 時,它會繼承 B 的預設參數,儘管在 D 中被覆寫。
解釋在於指標的靜態類型 (B),它決定了預設值虛擬函數呼叫期間使用的參數。即使指向的物件是 D 類型,指標的類型決定了預設參數的行為。
因此,為了獲得所需的輸出“D--data=20”,指標用於呼叫 print必須是 D 類型以確保使用覆蓋的預設參數。
以上是為什麼虛擬函數呼叫從基底類別而不是衍生類別繼承預設參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!