虛擬函數預設參數行為:一個不可預見的難題
在此程式碼片段中,出現了關於虛擬函數預設參數行為的困境:
class B { public: B(); virtual void print(int data = 10) { cout << endl << "B--data=" << data; } }; class D : public B { public: D(); void print(int data = 20) { cout << endl << "D--data=" << data; } }; int main() { B* bp = new D(); bp->print(); return 0; }
預期輸出:
[ D--data=20 ]
實際輸出:
[ D--data=10 ]
理解行為:
C 標準在第8.3.6.10 節中規定,虛擬函數呼叫的預設參數由表示物件的指標或引用的靜態型別決定。在本例中,由於 print 函數是透過 B (bp) 類型的指標呼叫的,因此使用了 B::print 的預設參數,導致意外的輸出。
結論:
透過指標或引用呼叫虛擬函數時,必須仔細考慮預設參數行為。指標或引用的靜態類型決定了使用哪些預設參數,如果不正確理解,這可能會導致意外結果。
以上是為什麼虛擬函數呼叫繼承基底類別而不是衍生類別的預設參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!