随笔 - 30  文章 - 67  trackbacks - 0
<2013年6月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

收藏夹

Oops

搜索

  •  

积分与排名

  • 积分 - 83456
  • 排名 - 275

最新评论

阅读排行榜

评论排行榜

 

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

FeedBack:
# re: [面试题1]如何实现不能被继承的C++的类,且能正常使用 2013-06-15 21:28 万连文
简而言之,我想是trunk技术?  回复  更多评论
  
# re: [面试题1]如何实现不能被继承的C++的类,且能正常使用 2013-06-17 23:02 zgpxgame
@万连文
简而言之我想是:

非虚继承 构造调用顺序
CBar() -call-> CFoo() -call-> CFinal()

虚继承 构造调用顺序
CBar() -call-> CFinal() // 私有,不可调用
CBar() -call-> CFoo()  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理