ATL中值得注意的C 技術

2021-04-09 02:22:33 字數 1602 閱讀 2777

1. 多重繼承中的名字衝突問題。

class father 

};class mother 

};class baby : public father, public mother 

virtual int mother::faint() 

//錯誤,無法區別father::faint和mother::faint。

};既然father和baby兩個類中的faint都是virtual的,那麼應該都可以過載了。

但是這一點總是渴望不可及,因為無法決議。c++的標準解法之一就是宣告兩個輔助的類。

class _father : public father 

virtual int fathe***int() = 0;

};class _mother : public mother 

virtual int mothe***int() = 0;

};class baby : public _father, public _mother 

virtual int mothe***int() 

};但是這樣的做法並不是非常好。如果baby這個類過載了faint()函式,那麼fathe***int()和mothe***int()都被遮掩了;如果baby這個類沒有過載faint()函式,那麼baby就沒有辦法faint()了,因為他無法決議faint()這個函式來自**。仔細想想這還是很合乎邏輯的。孩子生下來誰知道是象爸爸還是象媽媽呢?

[ 深入解析atl pp 216 ]   很遺憾這個作者沒有看過scott mayer的effective c++。 ;((

[ effective c++ item 43 ]

但是atl的考慮效率更多一些,而上面的方法多了一層虛函式的呼叫。所以它提供了不是很pp的解法。

template

struct atl_no_vtable _father : public father 

};template

struct atl_no_vtable _mother : public mother 

};class baby : public _father, public _mother;

atl_no_vtable是乙個巨集,定義可以看msdn:

#ifdef _atl_disable_no_vtable

#define atl_no_vtable

#else

#define atl_no_vtable __declspec(novtable)

#endif

這裡直接理解做 __declspec(novtable),指明這個類在構造和析構的時候抹掉vtable。注意到類當中根本沒有用到vtable,所以抹掉就抹掉吧,無所謂了。這個方法雖然也是萬能的,但是在不支援novtable的編譯器上作優化卻是萬萬不能。比如gcc。;(

順便一提的還有所謂的著色技術。以上問題之所以是乙個問題是因為編譯過程中產生了名字衝突。如果名字不同那就無所謂名字衝突了,而且執行期的程式也不是用名字來查詢函式的。因此如果我們上述體系中還有乙個中間層,那麼你就可以在中間層中耍點小花樣來騙過編譯器:宣告乙個新的類而不是從原來的類中繼承,保證新的類中函式的擺放和繼承回來的類是一樣的,同時把名字改一下。這種方法已經過氣了,多說無益,不提也罷。 

C 中值得注意的細節地方 逐步更新中

1.static的作用 static對於函式來說,只有隱藏的作用,即把本函式設定為本檔案可見。static對於變數來說,不僅可以隱藏,還讓變數存放在靜態儲存區域,具有永久性和預設為零。2.struct與類的大小 在對struct和類用sizeof 取大小時,會遵循對齊原則 盡可能地湊4和湊8 例如 ...

值得注意的函式

函式 嚴重性 解決方案 gets 最危險 使用 fgets buf,size,stdin 這幾乎總是乙個大問題!strcpy 很危險 改為使用 strncpy。strcat 很危險 改為使用 strncat。sprintf 很危險 改為使用 snprintf,或者使用精度說明符。scanf 很危險 ...

休閒類遊戲開發中值得注意的問題

如今手機休閒類遊戲已經成為人們日常生活中不可缺少的娛樂活動,面對成千上萬中遊戲的,怎樣才能從中脫穎而出呢?要想開發一款成功而又吸引玩家的遊戲不是一件簡單地事情,所以休閒類遊戲開發中有哪些問題是值得我們注意的呢?如何能讓玩家不會有枯燥感 社交性 大部分的休閒類遊戲經典案例都貫穿著二點要素,威望值和共享...