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