Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1478977
  • 博文数量: 148
  • 博客积分: 2234
  • 博客等级: 大尉
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 21:34
个人简介

未来很长。

文章存档

2017年(7)

2016年(4)

2015年(1)

2014年(6)

2013年(31)

2012年(99)

分类: C/C++

2014-07-25 10:43:58

一道笔试题的思考:

记得,找工作时,遇到了这样的一道笔试题。记不清是那个公司的笔试题,反正觉得自己当时还真费了一点功夫的,但是也就搞定了一部分,结果还是被另一部分给鄙视啦!

现在静下来分析实现如下:

题目:用C++设计一个不能被继承的类

不能被继承?不能被继承?不能被继承?按照继承的理论知识分析,我们只要把类的构造函数设置为私有的,即可解决问题。

因为那样的话,子类就没有办法访问基类的构造函数,从而就阻止了进行子类构造对象的任务实现,也就达到了不可继承的目的。

但是,假设那样,这个类我们在其它地方怎么使用呢?那这样子给我们的利用也造成了一定的障碍。

好了。你是不是也想到了,定义静态方法,在方法内部实现一个对象,然后返回它的指针。

Ok?那怎么释放掉呢?再照样设计一个释放内存函数,问题就会迎刃而解。

OK。按照这个逻辑分析。示例代码如下:

点击(此处)折叠或打开

  1. #include<iostream>
  2.  using namespace std;
  3.   class A
  4.   {
  5.   public:
  6.      static A * Construct(int n)
  7.       {
  8.           A *pa = new A;
  9.           pa->num = n;
  10.           cout<<"num is:"<<pa->num<<endl;
  11.           return pa;
  12.      }
  13.      static void Destruct(A * pIntance)
  14.      {
  15.          delete pIntance;
  16.          pIntance = NULL;
  17.      }
  18.      private:
  19.              A(){}
  20.              ~A(){}
  21.      public:
  22.              int num;
  23.  };
  24.  void main()
  25.  {
  26.      A *f = A::Construct(9);
  27.      cout<<f->num<<endl;
  28.      A::Destruct(f);
  29.  }

好了,这个类就这样子。按照我们的理论分析,我们的实践结果是完全成立的。

但是,这个题,它比较有挑战性,什么意思呢?难道你没有发现,咱们这水平也就仅仅有面试资格,还不可以破格录用的。

怎么啦?你可能会反问我。难道你真的没有看明白?确定没有看明白?如果是真的话,那我就告诉你吧!

咱们的类不可以实现在栈上创建对象。也就是说,仅仅只可以在堆上构建任何的一个对象,而在栈上就无能为力了。

私有的构造函数极大的局限性就这样一览无余了。

好吧!我们修改它,也就是所谓的为它打“补丁吧”,请看示例代码:

点击(此处)折叠或打开

  1. 1 #include<iostream>
  2.  2 using namespace std;
  3.  3 template <typename T>
  4.  4 class Base
  5.  5 {
  6.  6 friend T;
  7.  7 private:
  8.  8 Base() {}
  9.  9 ~Base() {}
  10. 10 };
  11. 11
  12. 12 class Finalclass : virtual public Base<Finalclass>
  13. 13 {
  14. 14 public:
  15. 15 Finalclass() {}
  16. 16 ~Finalclass() {}
  17. 17 };
  18. 18 void main()
  19. 19 {
  20. 20 Finalclass *p = new Finalclass; //堆上对象
  21. 21 Finalclass fs; //栈上对象
  22. 22 }
  23. OK。现在看看我们的Finalclass类。

    继承于Base,Base为虚基类,因为它是Base的友元,所以,它可以访问基类的私有构造函数,以及析构函数。编译运行时是正确的。

    也就是说,可以创建堆上的对象,并且可以构建栈上的对象。

    可否继承?假如它作为一个基类被一个类继承,在编译时是完全可以通过的。

    这一点没有什么疑问,问题就出在运行时:

    当子类在构造对象时,因为是虚继承,所以子类的构造函数会直接去调用Base类的构造函数,而Base的构造函数是私有的。运行错误error!!!

    这就是一个真正不能被继承的类。



阅读(10547) | 评论(1) | 转发(5) |
给主人留下些什么吧!~~

w3594059492014-07-31 14:13:55

不被语法支持的特性硬要去模拟。

如果不配合相应的说明文档提供给别人用,且这个问题又不会在编译期暴露出来,那么楼主被人问候全家的时候也就能理解是为什么了。