對類成員函式的另類呼叫方法

2021-07-22 22:17:34 字數 671 閱讀 3330

語言: c++

工程: vs / win32 / 空專案

簡介:該例演示了在沒有類例項存在的情況下,對類方法的呼叫,同時也證明了虛函式表是不依賴於物件例項而存在的

#include #include using namespace std;

typedef unsigned long ulong;

class a

試驗一、二證明,對類中的(非靜態)方法的呼叫,並與一定需要有類例項的存在,而只要這個例項「曾經存在過」(影響虛表的建立)就行了。

試驗證明,虛函式表是在編譯時遇到第乙個物件的定義時(a2 a2;)才建立的(仍在編譯期),如果整個程式沒有類例項,則不會建立虛函式表。

但如果乙個基類沒有建立相應例項,而其派生類建立了相應例項,則該基類也會預設生成虛函式表。

如果乙個類中含有資料成員,且其方法涉及對自身資料成員的操作(大多數的類都是這樣的),則儘管可以想上面那樣「無例項呼叫類方法」,

但這樣的呼叫時沒有意義的,所以對於這樣的類,需要關注類例項的存在性。

(通過分析彙編**可知),類指標(介面指標)呼叫類方法時,如果是呼叫的非虛函式成員,則實際在編譯時,就轉化為函式**位址了;

而對於虛成員函式的呼叫,則在編譯時,轉化為對虛汗表的查表運算。

類成員函式呼叫

大家都知道c 的虛函式前必須加virtual,但如果一連串的繼承下來,有的忘了加virtual會出現什麼情況呢?為了滿足我的好奇心,做了點實驗然後有了本文,僅僅是好玩,沒有啥實際意義。本文只給出vs2005的情況 首先,如果是單一類,沒加virtual的話那麼好辦,直接call a fun,非sta...

通過函式指標呼叫類成員函式的方法

通過函式指標呼叫乙個函式的時候,此函式必須有具體的位址,因此當呼叫乙個類成員函式的時候,此成員函式必須宣告為static,即靜態成員函式,這樣就能通過函式指標獲取到成員函式的位址,進而呼叫。關於靜態成員函式 編譯器在編譯乙個普通成員函式時,會隱式地增加乙個形參this,並把當前物件的位址賦值給thi...

類成員函式呼叫的細節

class concrete void printerror private int val void main 為什麼會出現這種情況呢?原來是,函式定義的時候,就一直存在了。即無聊是否 例項化了乙個物件,print 這個函式,都是存在的。所以 pc print 是可以找到函式的入口的。只是這時候,...