3 回答

TA貢獻1786條經驗 獲得超11個贊
默認參數完全是編譯時功能。即在編譯時執行默認參數的替換,以代替缺少的參數。因此,顯然,成員函數的默認參數選擇不可能取決于對象的動態(即運行時)類型。它始終取決于對象的靜態(即編譯時)類型。
您在代碼示例中編寫的調用將立即被編譯器解釋為bp->print(10)與其他無關。

TA貢獻1878條經驗 獲得超4個贊
標準說(8.3.6.10):
虛函數調用(10.3)在虛函數的聲明中使用默認參數,該聲明由表示對象的指針或引用的靜態類型確定。派生類中的重寫函數不會從其重寫的函數中獲取默認參數。
這意味著,由于您要print通過類型的指針進行調用B,因此它將使用默認參數B::print。

TA貢獻1813條經驗 獲得超2個贊
通常,使用在特定范圍內可見的那些默認參數。您可以(但不應該)做一些時髦的事情:
#include <iostream>
void frob (int x) {
std::cout << "frob(" << x << ")\n";
}
void frob (int = 0);
int main () {
frob(); // using 0
{
void frob (int x=5) ;
frob(); // using 5
}
{
void frob (int x=-5) ;
frob(); // using -5
}
}
在您的情況下,基類簽名是可見的。為了使用派生的默認參數,您必須通過指向派生類的指針顯式調用該函數,方法是這樣聲明或正確地對其進行強制轉換。
- 3 回答
- 0 關注
- 470 瀏覽
添加回答
舉報