由STL的Adapter介面卡想到C 多型

2021-10-03 04:26:53 字數 1359 閱讀 1386

這幾天疫情在家閒來無聊,翻開許久沒看的stl開始復讀起來。

mem_fun_ref這個函式印象很深。

屬於function adapter。

最常見的用法:

#include #include #include #include #include using namespace std;

class base

virtual void donextthing() };

class int : public base

virtual void dosomething()

void print() const

private:

static int count;

int mi;

};int int::count = 0;

void main()

; vectorvec(arr,arr+10);

for_each(vec.begin(),vec.end(),mem_fun_ref(&int::print));

int* i = new int(3);

int j(5);

cout << "j的大小為:"<< sizeof(j) << endl;

printf("address of base::dosomething %x\n", &base::dosomething);

printf("address of derived::dosomething %x\n", &int::dosomething);

printf("address of derived::donextthing %x\n", &int::donextthing);

printf("address of derived::print%x\n", &int::print);

void(__thiscall int::* f)(void) = &base::dosomething;

(i->*f)();//->*的用法,經由物件指標呼叫

(j.*f)(); //.*的用法,經由物件呼叫

}

依次輸出容器內的各個物件。

那這到底是怎麼實現的呢?

我們給mem_fun_ref傳入了函式的位址,這個是int,派生類的位址。

媽的語言組織能力太差,直接上圖,一切盡在不言中

也就是說父類和子類的虛函式的位址是一樣的,乙個函式佔4個位元組的記憶體,並且虛函式都是連續的位址,這樣子類就只需要存乙個虛函式表和乙個偏移就行了,呼叫的時候才用__thiscall機制,傳入this指標,找到其虛函式表,再呼叫!

介面卡模式 物件介面卡 Adapter

介面卡模式,將乙個類的介面轉換成客戶希望的另外乙個介面。物件介面卡模式 在這種介面卡模式中,介面卡容納乙個它包裹的類的例項。在這種情況下,介面卡呼叫被包裹物件的物理實體。小菜難得能和大鳥一起看nba直播,球賽完了,小菜還陶醉在火箭隊今年能怎樣怎樣,大鳥卻又開始出題了。姚明是美國nba的華人,假設他剛...

介面卡模式 Adapter

一句話 什麼是adapter adapter 就是乙個轉換器,比如乙個電源插頭可以讓乙個兩插頭的電器使用牆壁上的三插頭電源。這次的介紹將不寫 雖然設計模式是為了 而生,但我認為這是一種看世界的方法,不僅僅是一種 的設計方式,所以這次的介面卡模式因為比較簡單和容易理解就不再寫 解釋,但介面卡的思想能用...

Adapter 介面卡模式

1.概念 介面卡模式 adapter pattern gof95 把乙個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。2.兩種形式 a.類的介面卡模式 b.物件的介面卡模式 3.模擬問題 現在假設我們的程式已經設計了介面request介面,但是...