貌似好久没有自己写过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 阅读(4411)
评论(3) 编辑 收藏 引用 所属分类:
C++ 、
面试