深入解析ATL第六章筆記

2021-06-19 21:32:18 字數 2496 閱讀 1173

1:多重繼承之傳遞夾層

由於c++的語法不能在派生類中區分來自不同基類,但原型一致的方法,所以類似的**是不合法的

class cacepowerll:public icowboy,

public iartist

;

若要在com類中實現來自不同介面但原型一致的方法,則可借助傳遞夾層

struct _iartist:public iartist

stdmethodimp artistdraw() = 0;

};struct _icowboy:public icowboy

stdmethodimp icowboydraw() = 0;

};class cacepowerll:public _iartist,

public _icowboy

;

_iartist和_icowboy都是過渡類,他們分別實現2個名字衝突的方法,並把方法傳遞給另一名字唯一的純虛函式,這個技巧用_iartist::draw和_icowboy::draw填充iartist和icowboy的vtbl,傳遞夾層消除了名字衝突,代價是每個過渡類需要乙個額外的虛表,額外的虛函式呼叫。還可以用標準的atl技巧來實現

templatestruct atl_no_vtable _iartist:public iartist

};templatestruct atl_no_vtable _icowboy:public icowboy

};class atl_no_vtable cacepowerll:public _iartistpublic _icowboy;

這種方法在有個缺點,在com類中不能提供draw的實現,否則會遮蔽_iartist::draw/_icowboy::draw的呼叫

2:介面著色

如果2個類的虛表有相同的方法數目,並且相同偏移量上的方法有相同的原型特徵,則可使用介面著色技術:兩個布局相容的類可以型別不相容。其實很簡單,只不過是按照com所要求的虛表結構另行構造而已,其好處是可以實現兩個介面語義完全相同但是iid卻不相同的介面。這也體現了com介面實現的靈活性

class ia

;class ib

;class cb:public ib

3.tear-off

teaf-off的主要目的是把一些很少需要訪問的介面抽離出來單獨生成乙個內部com類,等需要訪問介面時才在queryinte***ce中去建立此com類並訪問相應的介面,從而達到減少外部com類的大小(繼承實現的每個介面都有虛指標和虛表)。實現tear-off介面時使用ccomtearoffobjectbase作為基類並快取所有者的iunknow指標。外部組建通過com_inte***ce_entry_tear_off設定建立內部組建的函式指標

class ca;

class atl_no_vtable cb :

public ccomtearoffobjectbase,

public ccomcoclass,

public ib

class atl_no_vtable ca :

public ccomobjectrootex,

public ccomcoclass,

public ia

begin_com_map(ca)

com_inte***ce_entry(ia)

com_inte***ce_entry_tear_off(iid_ib,cb)

com_inte***ce_entry_cached_tear_off(iid_ic,cc,m_spunk.p)

end_com_map()

}//com_inte***ce_entry_tear_off儲存了建立cb的函式指標,當使用者通過組建ca的介面查詢ib時便會呼叫_creator來建立cb

#define com_inte***ce_entry_tear_off(iid, x)\

,static hresult winapi _creator(void* pv, refiid iid, void** ppvobject, dword_ptr dw)

template class ccomtearoffobject : public base

// set refcount to -(long_max/2) to protect destruction and

// also catch mismatched release in debug builds

virtual ~ccomtearoffobject()

stdmethod_(ulong, addref)() throw()

stdmethod_(ulong, release)() throw()

stdmethod(queryinte***ce)(refiid iid, void ** ppvobject) throw()

};

tear-off與聚合很相似

第六章 深入模板

django內建的模板引擎包含模板上下文 模板變數 標籤,過濾器 模板上下文 模板變數 變數值有檢視函式或檢視類傳遞所得 標籤 對變數進行控制輸出,例如判斷和迴圈控制等 過濾器 多變數進行操作處理。variable1 字串或整型 variable2 variable3 元組或列表 屬性 索引 dja...

第六章筆記

頂層const與底層const的區別 頂層const是指標物件本身是乙個常量,而底層const是指標所指的物件是乙個常量,理解起來就相當於前者是直接,後者是間接。宣告函式可以多次,但是每個形參只能用實參預設初始化一次,即後續宣告只可以為未預設初始化的形參新增預設實參,而且其形參右側的所有形參必須都有...

mysql第六章 第六章 mysql日誌

第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...