虛函數的默認參數的值是依賴對象靜態類型決定的
我們來先從一道題來引出這個問題:
這道題的要求是輸出結果是什麼?
如果你的選項不是B,那麼你需要跟着我一起來學習一下,虛函數的默認參數到底需要取哪個?
標準庫規定
就是說,虛函數的默認參數取的是靜態類型的。
那麼什麼是靜態類型呢?舉個栗子?
A *a = new A; // 這裏靜態類型就是A
B *b = new B; // 這裏靜態類型就是B
// 調用虛函數
void test(base& b)
{
b.fun(); // 這裏不管傳進來的是什麼類型,靜態類型都是 base
}
題目解釋
現在大家應該大概明白了,我們再看看這道題。
首先創建一個 B 類對象,B *p = new B;
、然後用這個 B 類指針調用 test 函數。
關鍵來了:這裏 test 在A類裏面,所以 test 的調用棧是這樣的:
void test()
{
A *this;
this.func(); // 這裏靜態類型是A。
}
所以最後虛函數的默認參數取的是 A 類虛函數默認參數,內容由於 B 類的虛函數對 A 類的虛函數進行了覆蓋,所以用的是 B 類的內容。
所以結果是 B->1
。
叮~?