簡體   English   中英

解決vptr

[英]Resolving of vptr

class base {
public:
    virtual void fn(){}
};

class der : public base {};

我知道編譯器在類中提供了一個成員調用VPTR,該成員調用由構造函數在運行時使用確切的VTABLE初始化。 我有兩個問題

1)哪個班級擁有VPTR。 或所有班級都有單獨的VPTR。

2)執行語句der d; 在運行時如何解決VPTR?

vtable是包含虛擬函數的類創建和用於從it.It裝置在程序派生的類vtable將用於創建base類和der這些的class.Each vtables將包含虛擬函數的地址void fn()現在注意der類不包含void fn()的定義,因此它的vtable包含base類的void fn()函數的地址。因此,如果您像d.fn();那樣進行調用d.fn(); base類的void fn()函數將被執行。

注意:虛擬表和虛擬指針是實現細節,盡管我所知道的所有C ++編譯器都使用它們,但標准並沒有強制要求它們,只有結果是。

要回答您的特定問題:具有虛擬方法的類的每個實例(自己的或繼承的)或具有(某個地方)虛擬繼承關系的類都將至少需要一個虛擬指針。

可以有多個(涉及虛擬繼承或多重繼承時)。

您的示例中,單個虛擬指針就足夠了。 但是,將其稱為class一部分是沒有意義的。 虛擬指針是實例(對象)的一部分,並且不屬於類規則,因為它們適用於語言,並且虛擬指針是一種實現機制。

1)哪個班級擁有VPTR。 或所有班級都有單獨的VPTR。

如果class是多態的(即包含virtual函數或具有virtual繼承),則每個class 對象都有其自己的vptr 。在這種情況下,兩個類都具有virtual函數。

2)執行語句der d時; 在運行時如何解決VPTR?

您只是在聲明der的對象。 但是,即使您調用一個函數,在這種情況下,對任何函數的調用也會在編譯時解決。 僅當使用指針/引用調用函數時,虛擬函數解析才會出現。

暫無
暫無

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

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