我们对这个类的功能是这么期望的:
任何类从它继承都不能被实例化
同时这个类本身我们也不希望它被实例化.
如何实现这个类那?很简单!那就是实现一个构造函数和析构函数都是**的类就行了.同时在这类里面将我们的CParent声明为友员. 代码如下:
class CFinalClassMixin
{
friend class CParent;
**:
CFinalClassMixin(){}
~CFinalClassMixin(){}
};
>//我们的CParent代码应该如下:
class CParent:publicCXXX
{
public:
CParent(){}
~CParent(){}
};
它是从CXXX扩展的一个类(注,此时它还是能够被继承).现在我们需要它不能被继承.那么只要将代码改成
class CParent:public CFinalClassMixin, public CXXX
{
public:
CParent(){}
~>CParent(){}
};
就行了.现在从CParent继承一个子类试试
class CChild:public CParent{};
编译一下代码试试,发现:竟然没有作用!!
靠,这是为什么!
现在再回想一下我们这么操作的原因,也就是这个方案的原理,那就是让父类可以访问Mixin类的构造函数,但是子类不能访问.
现在看看我们的代码,发现父类是CFinalClassMixin类的友员,可以访问它的构造函数.因为友员不能继承,所以CChild不能访问CFinalClassMixin的构造函数.所以应该不能被实例化.
CChild的确不能访问CFinalClassMixin的构造函数,但是它却不必调用它!我想这就是问题的原因所在.CChild是通过CParent来构造CFinalClassMixin的,所以这个友员对他并没有什么用处!
现在问题找到了.要解决很简单.只要让CChild必须调用CFinalClassMixin的构造函数就行了,怎么才能达到目的呢?
还记得虚继承吗?虚继承的一个特征就是虚基类的构造函数由最终子类负责构造!所以将CParent从CFinalClassMixin继承改成从CFinalClassMixin虚继承就可以了.代码如下:
class CParent:virtual public CFinalClassMixin, public CXXX
{
public:
CParent(){}
CParent(){}
};
现在试试,行了.
但是可能有些人会对多继承心有余悸!但是我们这里并没有必要这么担心!为什么?因为我们的CFinalClassMixin类是纯的!pure! 也就是说它根本没有成员变量!那么我们就根本不用担心多继承带来的最大问题.菱形继承产生的数据冗余.以及二义性.