[英]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.