我們先來看看類的記憶體結構吧:
class a
;
int read()
public
virtual int as()
};
對於以上的類的說明,當建立乙個例項時,其記憶體結構如下(不同的c++實現略有不同):
+0000: 成員變數 int a
+0004: $a$vtable指標 --> +0000: 成員函式指標 as
為什麼op函式和read函式不需要在類中體現呢?因為沒有必要。
當c++編譯以上的類時,它會產生類似以下的成員函式(不同的c++實現略有不同):
//op函式
int $a$op@i_(a* this, int value)
//read函式
int $a$read@_(a* this)
//as函式
int $a$as@_(a* this)
也就是說,函式名本身就指明了函式是屬於哪個類的(連引數型別都有),因此,編譯器在編譯**時,可以直接呼叫該類的成員函式,而不需要類本身提供任何資訊。
例(0):
a a;
對於函式呼叫:
a.read();
此時,a是a的例項,因此編譯生成**為:
$a$read@_(&a);
例(1):
a a;
對於函式呼叫:
a.as();
此時,a是a的例項,因此編譯生成**為:
$a$as@_(&a);
例(2)
a* pa;
對於函式呼叫:
pa->read();
對應生成**為:
$a$read@_(pa);
例(3)
a* pa;
對於函式呼叫:
pa->as();
對應生成**為:
(pa->$a$vtable[0])(pa);
請注意:
如果不是用指標呼叫,那麼是不是virtual函式,呼叫方法是一樣的,參見例(0)和例(1)
如果是指標呼叫,例(2)和例(3)就是呼叫virtual函式和普通成員函式的區別。就因為有這區別,所以virtual函式必須在類中佔一席之地
C 空類以及沒有成員變數的類的大小
關於c 中空類的大小為1,我們大家都有所了解,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有很多不明之處的。include usingnamespacestd classa classb classc publica classd publicb,publicc intmain 程式執行的...
C 空類及沒有成員變數的類的大小例項分析
眾所周知的c 中空類的大小為1,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有相當一部分開發人員對此有很多不明之處的。這裡我們以如下 為例 includ程式設計客棧e using namespace std class a class b class c 程式設計客棧 public a c...
類中宣告的函式和類的成員函式
define crt secure no warnings include using namespace std class a void a f1 void f int main 在類內宣告的函式未必是類的成員函式,也許只是宣告一下,告訴編譯器,我有這個函式。編譯器說,好,我知道了。但是實現f ...