C 虛函式表解析 高階篇

2021-07-14 03:25:21 字數 1885 閱讀 2147

原文:

一、前言在《

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技...