JAVA中,final修饰的类不能被继承;而C++中得自己去实现。
介绍两种思路:(1)private 构造函数;(2)使用模板、虚拟继承、友元。
(1)直观思路,将类的构造函数声明为private,但是为了创建该类的对象,则必须提供创建对象和释放对象的接口,用static函数成员实现。
方法优点:实现方便,移植性很好; 缺点: 只能定义指向该类对象的指针,即对象只能存储在堆上,不能再栈上。
#include "stdafx.h" #include<iostream> using namespace std; class FinalClass { private: FinalClass(){}; ~FinalClass(){}; public: int m; static FinalClass *CreateInstance() { FinalClass * obj=new FinalClass; obj->m=2; return obj; } static void DeleteInstance(FinalClass * obj) { if(obj!=NULL) delete obj; } }; int _tmain(int argc, _TCHAR* argv[]) { FinalClass *obj=FinalClass::CreateInstance(); cout<<obj->m<<endl; FinalClass::DeleteInstance(obj); system("pause"); return 0; }
(2)使用两个类之间的虚拟继承实现。
方法优点:可以定义该类的对象和指针,即对象既可以存储在堆上,又可以存储在栈上。和一般类的使用没什么区别,只是不能被继承。
缺点:稍微有点复杂,需要使用模板,友元等概念。思路移植性不好。
template<typename T> class FinalBaseClass { private: FinalBaseClass(){}; ~FinalBaseClass(){}; friend T; }; class FinalClass2 :virtual public FinalBaseClass<FinalClass2> { public: FinalClass2(){}; ~FinalClass2(){}; int m; }; int _tmain(int argc, _TCHAR* argv[]) { FinalClass2 *obj1=new FinalClass2; obj1->m=4; cout<<obj1->m<<endl; delete obj1; system("pause"); return 0; }