首頁  >  文章  >  後端開發  >  為什麼虛擬函數的預設參數使用基底類別的值而不是衍生類別的值?

為什麼虛擬函數的預設參數使用基底類別的值而不是衍生類別的值?

Susan Sarandon
Susan Sarandon原創
2024-11-09 22:00:03817瀏覽

Why Does a Virtual Function's Default Argument Use the Base Class's Value Instead of the Derived Class's?

理解虛函數預設參數行為

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn