设计一个不能被继承的类-C++实现(来源于剑指名企offer)

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;
}




你可能感兴趣的:(设计一个不能被继承的类-C++实现(来源于剑指名企offer))