当前位置: 首页 > news >正文

100-59

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

59.不能被继承的类(语法)。
题目:用C++设计一个不能被继承的类。

分析:这是Adobe公司2007年校园招聘的最新笔试题。
这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。

思路:

这道题,初看起来比较奇葩。对于我这种新手来说真的是这样的。当我第一眼看到这个题目的时候,基本上是没有思路的,后来我想了下,貌似在Effective c++上看到过类似的说明,说是如果不想用编译器为你自动生成的一些函数,就要明确的指明出来。它上面说的方法就是将这些个函数声明为私有函数。于是,我就想到,如果将某个类的构造函数和析构函数都声明为私有的话,那么如果有新的类对其进行继承,在声明新的变量时,由于父类的构造函数无法调用,编译器就会报错。这是非常好的 ,因为让错误出现在编译阶段远远要好于让其出现在运行时。。。于是,说干就干,只要简单的将构造函数和析构函数都声明为私有就行了。

但是,菜鸟就是菜鸟,觉得这么一道题难道就是这样就解决了?不自信的又查看了july大神的解答。得到了这么一个参考:

// Define a class which can't be derived from 
template <typename T> class MakeFinal 
{ 
      friend T; 
private: 
      MakeFinal() {} 
      ~MakeFinal() {} 
};
class FinalClass2 : virtual public MakeFinal<FinalClass2> 
{ 
public: 

      FinalClass2() {} 
      ~FinalClass2() {} 

};
于是乎当我们定义这么一个子类时,会编译出错:


class Try : public FinalClass2 
{ 

public: 
      Try() {} 

      ~Try() {} 
};
这个类使用起来和一般的类没有区别,可以在栈上、也可以在堆上创建实例。尽管类MakeFinal<FinalClass2>的构造函数和析构函数都是私有的,但由于类FinalClass2是它的友元函数,因此在FinalClass2中调用MakeFinal<FinalClass2>的构造函数和析构函数都 不会造成编译错误。 但当我们试图从FinalClass2继承一个类并创建它的实例时,却不同通过编译。由于类FinalClass2是从类MakeFinal<FinalClass2>虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass2而直接调用MakeFinal<FinalClass2>的构造函数。非常遗憾的是,Try不是MakeFinal<FinalClass2>的友元,因此不能调用其私有的构造函数。  基于上面的分析,试图从FinalClass2继承的类,一旦实例化,都会导致编译错误,因此是FinalClass2不能被继承。这就满足了我们设计要求。


转载于:https://my.oschina.net/dapengking/blog/94727

相关文章:

  • 只要这几步,webpack速成不是事儿
  • 百度天工携手康力电梯打造电梯物联网智能时代
  • 数据库表设计原则(多表字段尽量唯一)
  • Js中for in 和for of的区别
  • 观察转小写的操作-字符函数
  • 002_网上脚本执行请注意,慎重
  • Django中ORM之操作表记录
  • Flann库的MATLAB接口编译
  • #includecmath
  • 你相信永生吗?
  • 6421B Lab10 网络文件和打印服务的配置与故障排除
  • 记录idea创建多模块项目遇到的问题(Spring cloud项目,maven父子关系无法继承,使用模板创建web项目无法生成java和resource文件夹)...
  • QQ开放API
  • 【性能优化实践】优化打包策略提升页面加载速度
  • #、%和$符号在OGNL表达式中经常出现
  • .pyc 想到的一些问题
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 78. Subsets
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • canvas 高仿 Apple Watch 表盘
  • Centos6.8 使用rpm安装mysql5.7
  • CSS实用技巧干货
  • dva中组件的懒加载
  • Electron入门介绍
  • hadoop集群管理系统搭建规划说明
  • JavaScript设计模式之工厂模式
  • JSONP原理
  • mongo索引构建
  • MySQL几个简单SQL的优化
  • vue2.0项目引入element-ui
  • Vue组件定义
  • 对超线程几个不同角度的解释
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 工程优化暨babel升级小记
  • 回流、重绘及其优化
  • 经典排序算法及其 Java 实现
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 通过npm或yarn自动生成vue组件
  • 移动端唤起键盘时取消position:fixed定位
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 整理一些计算机基础知识!
  • 昨天1024程序员节,我故意写了个死循环~
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (2)nginx 安装、启停
  • (a /b)*c的值
  • (C)一些题4