第五十九届冠军(使用C++设计一个类不能被继承)

称号:使用C++设计一个类不能被继承。
分析:这是Adobe 公司2007 的笔试题最新校园招聘。

应聘者的C++基本功底外,还能考察反应能力,是一道非常好的题目。


分析:C++中父类的构造函数会调用子类的构造函数,从这一点出发, 我们能够将子类的构造函数权限设为私有,这样父类构造函数在调用子类构造函数时就会出错。可是这样做有一个副作用。私有的构造函数使得我们无法正常创造这个类的对象。尽管能够通过像单例模式中那样通过提供一个静态函数调用私有构造函数产生一个类对象并返回其指针或者引用,但这样仅仅能产生堆上的对象而无法在栈上产生类的局部对象。

这里採用这样一种实现方法:


使用一个具有私有构造函数的模板类FinalClassBase,FinalClass虚继承于该类,而且为该类的友元,因此FinalClass有权限调用基类的构造函数。这里FinalClass虚继承于FinalClassBase。所以以后全部试图继承FinalClass的派生类。必须在他们的构造函数里直接调用虚基类FinalClassBase的构造函数,此时就会由于没有对应的訪问权限而出错(图中提示不可訪问)。从而限制了FinalClass为一个不能被继承的类,满足了题目的要求。



版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/yxwkf/p/4715062.html