貌似好久沒有自己寫過blog了,對于自己這樣一個健忘的人,文采又這么差的人來說,正好借這個機會鍛煉一下自己的文字能力,同時記錄下學過的東西。
貌似用過C++也好久了,碰到這個問題,開始確實感覺到無力,最后還是搜索了下別人是怎么做的。據說是Adobe 07年的面試題。
1、第一想法大家都是,既然不能被繼承,也就是一旦繼承這個類之后,類就不能被初始化。
2、可能把類的構造函數私有化,和單例有點像,但是這樣類就不能正常使用了。
3、實在無力,查了下,他們是通過使用虛繼承解決這個問題的。
對于虛繼承,具體資料見:http://blog.163.com/xiangzaihui@126/blog/static/166955749201182294317243/
里面有一句話很重要:C++規定:把真正創建對象時所指定的類稱為是最派生類,虛基類子對象是由最派生類的構造函數通過調用虛基類的構造函數進行初始化的;
具體實現代碼如下:
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: }
當你創建CBar時,需要初始化CFinal,但是你不是他的friend,不能初始化(上面標紅)
如果你會問不要virtual行不行?
不行,由于不要virtual,你可以經過CFoo的friend訪問到CFinal,但是有virtual就不同了,你必須直接初始化CFinal(這是C++的規定,避免多次初始化)
但是有個問題,gcc不能編譯通過,在friend T出錯,vs2010沒有問題,希望知道的能給點幫助。
參考文獻:
http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/(C++實現不能被繼承的類)
posted on 2013-06-15 00:18
Cunch 閱讀(4427)
評論(3) 編輯 收藏 引用 所屬分類:
C++ 、
面試