用C++编写不能被继承的类
上一篇 / 下一篇 2012-08-27 11:00:08 / 个人分类:C++
一、分析
~+J/]^/S Z(goX!e0 51Testing软件测试网{KN]S%Jc#fY!X在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字。
%me`^ij1`[X \p0 51Testing软件测试网2jigQWK(^首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函 数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。
)u6EW$I8H0 51Testing软件测试网]6e8u.n.Hy]$F可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?
'V a0h3@U5P z]0 51Testing软件测试网%O7i[6V5T i3e通过定义静态来创建和释放类的实例。51Testing软件测试网^d,U&]{s)g
WoX$w.Pd0 二、实现51Testing软件测试网I1fD5o6otH
51Testing软件测试网DcwFH3cA'[ C下面是一个单利模式的实现51Testing软件测试网_bJXQTd*Y
51Testing软件测试网 v)Yk5fUr.B)_6f51Testing软件测试网8H%M-wV1CM(J:Y
51Testing软件测试网J'h-aO3] ^ D#include <iostream>
X(M0A%Q&c!S7D,w0using namespace std;
Lw(m8v!Z*hP.el2@;~ T,J0class Singleton
.yy~d\^]*bX@Y4k0{
M:{V*m"F3u"@0private:
i6Oh%vn!e4w0 Singleton();
C uq
bM)C1{,Z A0 ~Singleton();// {}51Testing软件测试网-QO9g3t(W`eb'S
static Singleton *instance;
r5bj*_h&V_0public:
:r|7@/y8H4`0 static Singleton* GetInstance()
#w
q9e W[2t0 {
$D,e
GQ f0
}2Fl,|JX^0 if(instance == NULL)51Testing软件测试网,Tb$A
O]_Z1| z:}zl-iz
{51Testing软件测试网I5]i]vR3q,Pc$g
instance = new Singleton();
aF9R#pL\ A0 }51Testing软件测试网nP/F2nC T3eG
return instance;
*U1Bb$QR"m4of0 } 51Testing软件测试网A/h'?@{
N#_b4K} m`
static void DeleteInstance()
fY(kvz0O3F-Y0 {
,c Dx:D.g(b6b2F0 if(instance != NULL)
@_`I!U`m
VGLA0 {51Testing软件测试网2DH'xl
C+A
m
delete instance;
A&d~;_o f4L;}3f1Ur-Q0 }
\'Zv a0`~;~:b0 }51Testing软件测试网r }h:lv9c
};
9a T8kIdQ#om]0Singleton* Singleton::instance=NULL;//一定要初始化(由于不能在方法体内部初始化,所以就放到外部)51Testing软件测试网+tz`kb3k:g;V6d0Q0r4}
}5v3_"}%E0int main()51Testing软件测试网C%A
P(^9lc'\
xT
{
Y-L9W
\0g%rsp8M0
@N$Tt)K1o!Y0} 51Testing软件测试网R:I Rd(cB$L&T&?m