使用c++完成一个不被继承的类
来源:互联网 发布:java poi word 编辑:程序博客网 时间:2024/06/15 23:17
在c#中要完成一个不被继承的类直接使用关键字sealed,在java中使用final同样可以完成该功能。在c++中要想完成此功能没有相应的关键字,但可以通过将此类的构造函数和析构函数设为private,这样,当继承该类的时候,由于子类需要先调用基类的构造函数,这样将发生错误。但此时实例化基类也出现了问题,因此,要完成实例化,则需要在类中申明一个公有的静态成员函数,使用此函数来完成该类的实例化。代码如下:
class SealedClass{
public:
static SealedClass *getInstance(){
return new SealedClass();
}
static void deleteInstance(SealedClass *pInstance){
delete pInstance;
}
private:
SealedClass(){};
~SealedClass(){};
}
虽然上述代码能够完成基本功能,但要完成此类的实例化还得通过一个静态函数,以下将介绍一种更加新颖的设计方式,使用模板和友类,代码如下:
template <class T>
class SealedClass1{
friend T;
private:
SealedClass1(){
cout<<"SealedClass1 construct"<<endl;
}
~SealedClass1(){
cout<<"SealedClass1 destruct"<<endl;
}
};
class SealedClass2:virtual public SealedClass1<SealedClass2>{
public:
SealedClass2(){
cout<<"SealedClass2 construct"<<endl;
}
~SealedClass2(){
cout<<"SealedClass2 destruct"<<endl;
}
};
class Try:public SealedClass2{
public:
Try();
~Try();
};
当实例化SealedClass2,由于SealedClass2是类SealedClass1的友类,因此,在SealedClass2中的构造函数和析构函数能够调用SealedClass1的构造函数,因此能够完成实例化,但当使用Try继承SealedClass2时,由于SealedClass2是SealedClass1的虚继承,因此实例化try的时候将跳过SealedClass2,直接调用SealedClass1的构造函数,但是Try不是SealedClass1的友类,而SealedClass1的构造函数是私有的,因此不能完成实例化。
- 使用c++完成一个不被继承的类
- 使用c语言完成了一个求素数的程序
- 【c++】实现一个不能被继承的类
- 一个继承JFrame的类调用一个继承JPanel的类,继承JPanel中的定义JPanel不显示
- 请写一个简单的幻灯效果页面,不使用JS来完成怎么做
- 请写一个简单的幻灯效果页面。如果不使用JS来完成,可以加分。
- 继承NSOperation类完成能被cancel的耗时操作
- 不使用加号,完成整数的相加
- 不使用+、-、*、/完成两个整数的相加
- 一个简单的类的继承的写法(C#)
- 一个使用完成端口管理modem池的类
- 【php】使用mysqli完成的一个数据库操作类
- 写一个字符串分割程序,在不使用string类和Array类内置函数的前提下完成该功能:
- c+中继承的使用
- C#--继承的基本使用
- 使用AngularJS完成一个简单的todoList
- 一个不使用MFC的CMemFile类
- C++-类的继承
- 你可以不成功,但是不能不成长
- 根据字体多少使UILabel自动调节尺寸
- i386段描述符中的可执行位(Executable位,非Expansion Direction位)
- 安装CentOS 6网络配置问题
- 孤狼啸月
- 使用c++完成一个不被继承的类
- HDU1172:猜数字
- 第一章 概述
- django使用mysql
- PowerVR wiki
- HDU3787:A+B
- mysql基本操作
- DBUtil中的update连接数据库程序
- java web 乱码处理