虛函數的默認參數的值是依賴對象靜態類型決定的

虛函數的默認參數的值是依賴對象靜態類型決定的

我們來先從一道題來引出這個問題:

在這裏插入圖片描述

這道題的要求是輸出結果是什麼?

如果你的選項不是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

叮~?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章