在 C 中,虛函數允許衍生類別覆寫基底類別中定義的函數的實作。但是,虛函數的預設參數行為可能會令人困惑。
問題描述:
考慮以下程式碼片段:
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),當透過a呼叫虛擬函數時指標或引用,預設參數派生自指標或引用的靜態類型,而不是衍生類別的重寫函數。
在這種情況下,bp 是 B 類型的指針,因此 B 的預設參數使用 ::print(即 10),覆蓋 D::print 的預設參數(即 20)。 因此,輸出為 D--data=10而非預期的 D--data=20。以上是為什麼虛擬函數的預設參數使用基底類別的值而不是衍生類別的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!