原文:
一、前言在《
c++虛函式表解析》中,對c++虛函式表進行了**,但是在談論虛函式表裡,至少有以下這些內容沒有涉及:
1)有成員變數的情況。
2)有重複繼承的情況。
3)有虛擬繼承的情況。
4)有鑽石型虛擬繼承的情況。
這篇文章將會是《
c++虛函式表解析》的乙個續篇,將以c++物件的記憶體布局為重點,也是一篇高階高階的文章。大家在讀這篇文章之前對c++有一定的基礎和了解,並能先讀《
c++虛函式表解析》。
二、物件記憶體布局的影響因素
物件記憶體布局的影響因素主要有以下幾項: 1
)成員變數
2)虛函式(產生虛函式表)
3)單一繼承(只繼承於乙個類)
4)多重繼承(繼承多個類)
5)重複繼承(繼承的多個父類中其父類有相同的超類)
6)虛擬繼承(使用virtual方式繼承,為了保證繼承後父類的記憶體布局只會存在乙份)
上述的東西通常是c++這門語言在語義方面對物件內部的影響因素,當然,還會有編譯器的影響(比如優化),還有位元組對齊的影響。在這裡我們都不討論,我們只討論c++語言上的影響。
本篇文章著重討論下述幾個情況下的c++物件的記憶體布局情況。
1)單一的一般繼承(帶成員變數、虛函式、虛函式覆蓋)
2)單一的虛擬繼承(帶成員變數、虛函式、虛函式覆蓋)
3)多重繼承(帶成員變數、虛函式、虛函式覆蓋)
4)重複多重繼承(帶成員變數、虛函式、虛函式覆蓋)
5)鑽石型的虛擬多重繼承(帶成員變數、虛函式、虛函式覆蓋)
三、虛函式表複習
typedef
void
(*fun
)(void
);
baseb;
funpfun
=null
;
cout
<<
<<
(int
*)(&b)
<<
endl
; cout
<<
<<
(int
*)*(
int*)(&b)
<<
endl
;
// invoke the first virtual function
pfun = (fun)*((int*)*(int*)(&b));
pfun();
我們同樣可以用這種方式來取得整個物件例項的記憶體布局。因為這些東西在記憶體中都是連續分布的,我們只需要使用適當的位址偏移量,我們就可以獲得整個記憶體物件的布局。
1)windows xp 和 vc++ 2003
2)cygwin 和 g++ 3.4.4
四、深入c++物件的記憶體布局
單繼承
關於單繼承c++物件的記憶體布局請閱讀《
c++ 物件的記憶體布局(單繼承)》和《
c++虛函式表解析(基礎篇)》
多重繼承
關於多重繼承c++物件的記憶體布局請閱讀《
c++ 物件的記憶體布局(多重虛擬繼承)》和《
c++虛函式表解析(基礎篇)》
重複非虛擬繼承
關於重複繼承c++物件的記憶體布局請閱讀《
c++ 物件的記憶體布局(重複非虛擬繼承)》
重複虛擬繼承
關於多重虛擬繼承c++物件的記憶體布局請閱讀《
c++ 物件的記憶體布局(重複虛擬繼承)》
C 虛函式表解析
前言 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式...
C 虛函式表解析
c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...
C 虛函式表解析
今天我做的筆記 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技...