您的位置:首页 > 编程语言 > C语言/C++

用C++实现一个不能被继承的类

2015-05-06 11:32 507 查看
在C++中,子类的构造函数会自动调用父类的构造函数子类的析构函数也会自动调用父类的析构函数。

要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。

那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。

可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?这难不倒我们,我

们可以通过定义静态来创建和释放类的实例。基于这个思路,我们可以写出如下的代码:

class FinalClass1

{

public :

static FinalClass1* GetInstance()

{

return new FinalClass1;

}

static void DeleteInstance( FinalClass1* pInstance)

{

delete pInstance;

pInstance = 0;

}

private :

FinalClass1() {}

~FinalClass1() {}

};

这个类在基本上就能实现不能继承的功能。但是每次如果你都用这样一个类的话,估计你到最后不是你的程序崩溃了,而是你自己崩溃的更早。

因此,我们这样设计。

class CFinalClassMixin

{

friend class CParent;

private:

CFinalClassMixin(){}

~CFinalClassMixin(){}

};

class CParent: public CFinalClassMixin

{

public:

CParent(){}

~CParent(){}

};

class CChild : public CParent

{

};

但是发现没有用,想一想也是,CChild构造函数调用CParent的构造函数,而CParent的构造函数再调用CFinalClassMixin的构造函数,很显然是合法的。

我估计你也想骂了,唧唧歪歪讲了这么就还是不行。

但是请你想想,如果我是在CChild的构造函数直接调用CFinalClassMixin的构造函数,而CFinalClassMixin的构造函数是private,不能被调用,那我们岂不是达到了目的,但是我们如何才能在CChild中直接调用CFinalClassMixin的构造函数而不是通过CParent去调用了。

给你一分钟去想想。。。。。。。。。。。。。。

哈哈虚继承,虚继承刚好可以实现上述目的。

因此:

class CFinalClassMixin

{

friend class CParent;

private:

CFinalClassMixin(){}

~CFinalClassMixin(){}

};

class CParent: virtual public CFinalClassMixin

{

public:

CParent(){}

~CParent(){}

};

哈哈发现CParent不再可以被继承了。

如果你不懂虚继承是个神马东东的话,你可以参考我的另外一篇文章:

虚继承

如果你看懂了,我相信你就懂了上述的方法了。

转自:http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: