100题之不能被继承的类

第五章 类的继承与派生之——类的继承与派生 1、通过已有的类来建立新类的过程,叫做“类的派生”,原来的类叫做“基类”,新建立的类则叫做“派生类”。 从类的成员角度看,派生类自动地将基类的所有成员作为自己的成员,这叫做“继承”。 基类和派生类又可以分别叫做“父类”和“子类”,有时也称为“一般类”和“特殊类”。 从一个或多个以前定义的类 (基类) 产生新类的过程称为派生这个新类称为派生类。 派生的新类同时也可以增加或者重新定义数据和操作,这就产生了类的层次性。 类的继承是指派生类继承基类的数据成员和成员函数。 继承常用来表示类属关系,不能将继承理解为构成 阅读详情

不能被继承的类
题目:用C++设计一个不能被继承的类。
分析:这是Adobe公司2007年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。
在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字,要实现这个要求还是需要花费一些精力。
首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。
可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?这难不倒我们,我们可以通过定义静态来创建和释放类的实例。基于这个思路,我们可以写出如下的代码:
///////////////////////////////////////////////////////////////////////
// Define a class which can't be derived from
///////////////////////////////////////////////////////////////////////
class FinalClass1
{
public:
static FinalClass1* GetInstance()
{
return new FinalClass1;
}

static void DeleteInstance( FinalClass1* pInstance)
{
delete pInstance;
pInstance = 0;
}

private:
FinalClass1() {}
~FinalClass1() {}
};
这个类是不能被继承,但在总觉得它和一般的类有些不一样,使用起来也有点不方便。比如,我们只能得到位于堆上的实例,而得不到位于栈上实例。
能不能实现一个和一般类除了不能被继承之外其他用法都一样的类呢?办法总是有的,不过需要一些技巧。请看如下代码:
///////////////////////////////////////////////////////////////////////
// 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() {}
};
这个类使用起来和一般的类没有区别,可以在栈上、也可以在堆上创建实例。尽管类MakeFinal<FinalClass2>的构造函数和析构函数都是私有的,但由于类FinalClass2是它的友元函数,因此在FinalClass2中调用MakeFinal<FinalClass2>的构造函数和析构函数都不会造成编译错误。
但当我们试图从FinalClass2继承一个类并创建它的实例时,却不同通过编译。
class Try : public FinalClass2
{
public:
Try() {}
~Try() {}
};

Try temp;
由于类FinalClass2是从类MakeFinal<FinalClass2>虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass2而直接调用MakeFinal<FinalClass2>的构造函数。非常遗憾的是,Try不是MakeFinal<FinalClass2>的友元,因此不能调用其私有的构造函数。
基于上面的分析,试图从FinalClass2继承的类,一旦实例化,都会导致编译错误,因此是FinalClass2不能被继承。这就满足了我们设计要求。

 

 

在 Ubuntu 上安装和配置 PostgreSQL 实录 本文介绍了在Ubuntu系统上安装和配置PostgreSQL数据库的完整步骤。主要内容包括:1)通过官方源或PPA源安装最新版本;2)修改配置文件(postgresql.conf和pg_hba.conf)以允许远程访问;3)设置postgres用户密码;4)创建新用户并配置权限;5)防火墙设置和重启服务;6)验证安装和远程连接方法。文章提供了详细的命令行操作指导,帮助用户完成从安装到远程访问的全部配置过程。 阅读详情

相关推荐

实战指南:彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例

本文详细介绍了如何彻底清除TIA Portal卸载后遗留的SQL Server WinCC实例,解决重新安装时的冲突问题。通过控制面板排查、注册表验证、安全卸载操作流程和注册表深度清理等步骤,确保完全移除残留组件,避免系统崩溃。文章还提供了安装环境重建策略和预防措施,帮助工程师高效管理西门子自动化软件。

weixin_30482181的博客 405

子类不能从父类继承哪些?

今天突然想起了一个问题,就是C++中,子类能否继承父类的静态成员函数和变量。在网络了解了一下,得到的结论大致是:     子类不能从父类继承的有:        1. 构造函数        2. 拷贝构造函数        3. 析构函数     子类能从父类继承的有:          1、静态成员变量        2、静态成员函数        3、友元函数      

chengonghao的博客 8372

单目视觉定位:深入解析PNP算法在机器人导航中的实战应用

本文深入解析了PNP算法在机器人单目视觉定位中的核心原理与实战应用。通过拆解坐标变换四步,详细阐述了如何从二维图像点反求相机三维位姿。文章结合OpenCV的solvePnP函数,提供了算法选择、参数调优及结果后处理的实用指南,并针对机器人导航中的特征匹配、尺度不确定性等挑战,给出了鲁棒性优化与实时性平衡的解决方案。

weixin_29083649的博客 419

面试题28:不能被继承的类

在C#中定义了关键字sealed,被sealed修饰的类不能够被继承。在Java中同样也有关键字final表示一个类不能被继承。C++11提供final关键字使得类不能够被继承。那么,如何自己实现一个不被继承的类?常规的解法是,把类的构造和析构函数都设置为private即可,然后公有派生;这是因为子类访问不到父类私有属性。这使用了C++构造派生类实例时会自动先调用父类构造函数的特性,同样析构的顺序和

iFuMI的博客 3549

抖音视频数据获取实战:从API调用到热门内容挖掘

通过抖音API获取视频数据,企业可快速构建数据驱动的运营体系。本文提供了从权限申请到商业落地的全流程指南,建议结合自身业务扩展功能。如有技术问题,欢迎​​评论​​区留言讨论!#抖音开发 #数据挖掘 #短视频运营 #API调用 #Python实战。

WBKJ_Noah_的博客 6391

论文阅读:Visual Relationship Detection with Language Priors

Visual Relationship Detection with Language Priors(ECCV2016) 文章   尽管大多数的relationship并不常见,但是它们的object和predicate却更频繁地独立出现。paper用这个insight分别独立训练训练object和predicate的模型,然后再进行组合来预测relationship。Visual relatio...

Kivee的博客 2877

微软面试100题之32 不能被继承的类

转载自:July  http://blog.youkuaiyun.com/v_JULY_v/article/details/6126406   题目:用C++设计一个不能被继承的类。 分析:这是Adobe公司2007年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。 在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有f

miao6664659的专栏 1059

鼎捷T100—二次开发:客制化联络对象维护作业 aooi350

鼎捷T100二次开发,客制化

weixin_52342654的博客 1132

程序员面试100题之32不能被继承的类

// 程序员面试100题之32不能被继承的类.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; class FinalClass1 { public: static FinalClass1* GetInstance()// why static because can not return l

Creek Shi 365

QT+Halcon实现螺纹检测

工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来: 1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹...

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 7050

【Unity Shader】Special Effects(十二)Glow 外发光(UI)

Properties_GlowColor ("外发光颜色", Color) = (0, 0, 0, 1)_GlowIntensity("外发光强度", Range(0, 1)) = 1参数详解:_GlowColor:外发光颜色,指定外发光的显示颜色。_GlowIntensity:外发光强度,指定外发光的显示强度,0为不可见,1为最强强度。

神码编程 931

微软100题(59)不能被继承的类

题目:用C++设计一个不能被继承的类。 思路:什么类不能被继承呢,继承时候要子类对象要调用父类的构造函数初始化子类对象中属于父类的部分,如果父类的构造是私有的了,那么子类就无法访问,那么就不能继承了 class NosealClass { public: static NosealClass* GetInstance() {

liuqing0517的博客 412

恒玄BES调试笔记-BES2500如何Dump Anc Audio数据

从YP的4M flash改HP3的2M flash只需要改: 原工程:target.mk的export FLASH_SIZE ?= 0x200000和common.mk里的KBUILD_CPPFLAGS += -DNEW_IMAGE_FLASH_OFFSET=0x100000 OTA工程:target.mk的NEW_IMAGE_FLASH_OFFSET ?= 0x100000和FLASH_SIZE ?= 0x200000 ...

leezs的博客 1672

【100题】第五十九题 用C++编写不能被继承的类

一,题目          用C++设计一个不能被继承的类。 二,分析                   在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字。          首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造

小田的专栏 1731

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

不能被继承的类 【微软面试100题 第五十九题】

题目要求:   用C++设计一个不能被继承的类。   参考资料:剑指offer第48题。 题目分析:   方法1:把构造函数设为私有函数,定义共有的静态函数来创建和释放类的实例;   方法2:利用虚拟继承和友元; 代码实现:    //把构造函数设为私有函数,定义共有的静态函数来创建和释放类的实例 class Temp { public: static Temp...

weixin_34376986的博客 148

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

程序员面试题精选100题(32)-不能被继承的类

题目:用java设计一个不能被继承的类。 两种途径: 1. 定义final的类 2.用private的构造器。。。然后用工厂方法,其实工厂类就是不能被继承的

z466459262的专栏 210

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]

程序员面试题精选100题(32)-不能被继承的类[C/C++/C#]   题目:用C++设计一个不能被继承的类。 分析:这是Adobe公司2007年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。 在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字,要实现这个要求还是需要花

chenglinhust的专栏 826

JavaScript中创建类及类的继承

JavaScript中创建类及类的继承 JavaScript 是面向对象的语言,引用数据类型都是对象,包括函数也是对象,同时还可以通过 Object 对象自定义对象。 但是,和其他面向对象语言(如 Java 等高级语言)比,也有很大差异,JS 中没有类或接口的概念,即不能直接定义抽象的类,也不能直接实现继承。不过,为了编程的方便,我们可以在 JS 中模拟类和继承的行为 简单来说就是Javascript中没有类的概念,不过它可以用构造函数来实现类的功能,构造函数就是一个函数,一般构造函数名首字母大写 实际上,

DangR_Jisoo的博客 639
上一篇: 100题之从尾到头输出链表
下一篇: 100题之O(1)时间内删除链表节点
mingming_bupt
博客等级 码龄17年 26粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值