首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
用C++设计一个不能被继承的类。
用C++设计一个不能被继承的类。
admin
2019-03-29
122
问题
用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
class MakeFinal { friend T; private: MakeFinal() {} ~MakeFinal() {} }; class FinalClass2 : virtual public MakeFinal
{ public: FinalClass2() {} ~FinalClass2() {} }; 这个类使用起来和一般的类没有区别,可以在栈上、也可以在堆上创建实例。尽管类MakeFinal
的构造函数和析构函数都是私有的,但由于类FinalClass2是它的友元函数,因此在FinalClass2中调用MakeFinal
的构造函数和析构函数都不会造成编译错误。 但当我们试图从FinalClass2继承一个类并创建它的实例时,却不同通过编译。 class Try : public FinalClass2 { public: Try() {} ~Try() {} }; Try temp; 由于类FinalClass2是从类MakeFinal
虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass2而直接调用MakeFinal
的构造函数。非常遗憾的是,Try不是MakeFinal
的友元,因此不能调用其私有的构造函数。 基于上面的分析,试图从FinalClass2继承的类,一旦实例化,都会导致编译错误,因此是FinalClass2不能被继承。这就满足了我们设计要求。
解析
这是Adobe公司2007年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。
在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字,要实现这个要求还是需要花费一些精力。
首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。
可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?这难不倒我们,我们可以通过定义静态来创建和释放类的实例。
转载请注明原文地址:https://www.kaotiyun.com/show/uRmZ777K
0
程序员面试
相关试题推荐
Thecommitteehasanticipatedtheproblemsthat______intheroadconstructionproject.
YourfriendDavidjustsentyouabookthatyouexpectedasabirthdaypresent.Sendane-mailtohimtoexpressyourappreciati
[A]Forcrowdfundingtowork,theprojectneedstocapturethepublicimagination.Andnotallacademicsarecomfortablewithse
输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:structListNode{intm_nKey;ListNode*m_pNext;};函数的声明如下:voidDeleteNode(L
利用MSN给bob@sina.com发送电子邮件内容“8号晚上到我家一起吃饭”。
如果要将页面上的某个图形设计成页面下载后显示在页面上,当鼠标放在它的上面时,该图形变为另一图形,那么可以通过______方法来设置。A.使用时间线B.“RolloverImage”命令C.将图形插入到表格中D.使用层与行为
软件设计中,有利于提高模块独立性的一个准则是______。
企业战略数据模型可分为两种类型:(35)描述日常事务处理中的数据及其关系;(36)描述企业管理决策者所需信息及其关系。35
随机试题
实验室间比对是按照预先规定的条件,由两个或多个实验室对()的被测物品进行检测的组织、实施和评价。
建设项目目标动态控制中,当发现目标偏离时应采取纠偏措施,为避免目标偏离的发生,应重视()。
关于战术性资产配置与战略性资产配置之间的比较,下列叙述正确的有()。
雇佣关系中的管辖形式是指()。
红光公司是一家摩托车生产企业,系增值税一般纳税人。税务机关对红光公司进行税务检查时,发现红光公司2008年下列业务并没有入账:(1)销售自产摩托车50辆,取得价款(不含增值税)550万元。另外,向购买方收取价外费用5万元。(2)销售自产
下面关于网络拓扑结构的说法中正确的是()。
《国家中长期教育改革和发展规划纲要(2010一2020年)》提出,把()作为人才工作的根本出发点和落脚点。
下列对“光污染”这一概念的理解,最准确的一项是()。文中[]应填入的词语是()。
《最高人民法院关于审理盗窃案件具体应用法律若干问题的解释》规定:各地高级人民法院可根据本地区经济发展状况,并考虑社会治安状况,在本解释规定的数额幅度内,分别确定本地区执行“数额较大”“数额巨大”“数额特别巨大”的标准。依据法理学的有关原理,下列表述正确的是
在Access中已建立了“雇员”表,其中有可以存放照片的字段。在使用向导为该表创建窗体时,“照片”字段所使用的默认控件是______。
最新回复
(
0
)