虛函數預設參數行為
在 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) ,該標準規定虛擬函數呼叫使用虛擬函數宣告中的預設參數由表示物件的指標或引用的靜態類型決定。在這種情況下,由於您透過類型B(即bp)的指標呼叫print(),因此使用B::print() 的預設參數,即使衍生類別D 中的重寫函數具有不同的預設值
因此,當透過基底類別指標或引用呼叫虛擬函數時,將應用基底類別函數的預設參數,而不是重寫的函數。理解這種行為很重要,可以避免在使用虛擬函數和預設參數時出現任何混淆或意外結果。
以上是預設參數在 C 虛擬函數中的行為如何?的詳細內容。更多資訊請關注PHP中文網其他相關文章!