题目描述:用C++设计一个不能被继承的类,在C#中定义了关键字sealed,被sealed修饰的类不能被继承。在JAVA中同样也有关键字final表示一个类型不能被继承。
解法一:把构造函数设为私有成员
- 在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数。
- 定义公有的静态函数来创建和释放类的实例。
- 此方法缺点:只能得到位于堆上的实例,而得不到位于栈上的实例。
实现:
class Sealed{
private:
Sealed(){}
~Sealed(){}
public:
static Sealed* GetInstance(){
return new Sealed;
}
static void deleteInstance(Sealed *sealed){
if(sealed != NULL){
delete sealed;
sealed = NULL;
}
}
};
解法二:利用虚拟继承
- 设计一个私有构造、析构函数模板类,将模板类型作为友元类。
- 设计Sealed类,虚拟继承设计的模板类,实现公有构造、析构方法。
- 此时Sealed类不能被继承,因为只有Sealed类是设计的模板类的友元类,而它的子类不是,所以Sealed类是不能被继承的类。
//解法二:利用虚拟继承
template <typename T>
class MakeSealed{
friend T;
private:
MakeSealed(){}
~MakeSealed(){}
};
class Sealed2: virtual public MakeSealed<Sealed2>{
public:
Sealed2(){};
~Sealed2(){}
};