簡體   English   中英

虛擬函數C ++中的動態綁定

[英]Dynamic binding in virtual functions C++

我有一個帶有1個虛函數的基類

class Base
{
public:
    virtual void print() {
        cout<<"IN BASE\n";
    }
}

現在我使用創建對象

Base b

和通話

b.print();

這是動態綁定嗎,因為“ Base”類包含1個虛函數,並且已創建其VTable。

在創建對象的相同上下文中,編譯器不需要使用虛擬分派,因為它知道確切的類型。 但這與虛擬函數的數量無關(是的,只要有至少一個虛擬函數,編譯器就會生成一個vtable並將一個vptr存儲在您的對象中)。

Base b;
b.print(); // can be optimized to b.Base::print(),
           // with no virtual dispatch

void f( Base& b ) {
   b.print();       // must use virtual dispatch (ignoring potential inlining)
}

“動態綁定”一詞通常意味着其他含義-使您可以從外部文件(DLL或SO)調用函數的管道,就好像它們是可執行文件的一部分一樣。

Base類具有一個vtable-畢竟,在編譯當前文件時,編譯器無法確定在項目的其他位置是否存在其任何派生類。

現在,調用是否跟隨vtable是實現細節-它取決於編譯器和設置。 一方面,它應該。 另一方面,如果對象是這樣的自動對象,則其類型在編譯時是已知的,並且可能不是Base 一個好的編譯器可能會優化vtable查找。

啟用了裝配體列表的構建將向您顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM