貌似好久沒有自己寫過blog了,對(duì)于自己這樣一個(gè)健忘的人,文采又這么差的人來說,正好借這個(gè)機(jī)會(huì)鍛煉一下自己的文字能力,同時(shí)記錄下學(xué)過的東西。
貌似用過C++也好久了,碰到這個(gè)問題,開始確實(shí)感覺到無力,最后還是搜索了下別人是怎么做的。據(jù)說是Adobe 07年的面試題。
1、第一想法大家都是,既然不能被繼承,也就是一旦繼承這個(gè)類之后,類就不能被初始化。
2、可能把類的構(gòu)造函數(shù)私有化,和單例有點(diǎn)像,但是這樣類就不能正常使用了。
3、實(shí)在無力,查了下,他們是通過使用虛繼承解決這個(gè)問題的。
對(duì)于虛繼承,具體資料見:http://blog.163.com/xiangzaihui@126/blog/static/166955749201182294317243/
里面有一句話很重要:C++規(guī)定:把真正創(chuàng)建對(duì)象時(shí)所指定的類稱為是最派生類,虛基類子對(duì)象是由最派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化的;
具體實(shí)現(xiàn)代碼如下:
1: #include <cstdio>
2: #include <iostream>
3:
4: template<class T> class CFinal{
5: friend T;
6: private:
7: CFinal(){ std::cout << "CFinal()" << std::endl; }
8: ~CFinal(){}
9: };
10:
11: class CFoo : virtual public CFinal<CFoo>{
12: public:
13: CFoo(){ std::cout << "CFoo()" << std::endl; }
14: ~CFoo(){}
15: };
16:
17: class CBar : public CFoo{
18: public:
19: CBar() { std::cout << "CBar" << std::endl; }
20: };
21:
22: int main()
23: {
24: //CBar bar;
25: CFoo foo;
26: while(1){}
27: return 0;
28: }
當(dāng)你創(chuàng)建CBar時(shí),需要初始化CFinal,但是你不是他的friend,不能初始化(上面標(biāo)紅)
如果你會(huì)問不要virtual行不行?
不行,由于不要virtual,你可以經(jīng)過CFoo的friend訪問到CFinal,但是有virtual就不同了,你必須直接初始化CFinal(這是C++的規(guī)定,避免多次初始化)
但是有個(gè)問題,gcc不能編譯通過,在friend T出錯(cuò),vs2010沒有問題,希望知道的能給點(diǎn)幫助。
參考文獻(xiàn):
http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/(C++實(shí)現(xiàn)不能被繼承的類)
posted on 2013-06-15 00:18
Cunch 閱讀(4427)
評(píng)論(3) 編輯 收藏 引用 所屬分類:
C++ 、
面試