版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012658346/article/details/52402715
1、设计一个不能被继承的类
1)将构造函数设为私有
此时子类不能访问基类的构造函数,因此创建子类时就会报错(无法访问private成员)
class Base_Uninherit{
private:
Base_Uninherit(){}
Base_Uninherit(const Base_Uninherit& rhs){}
Base_Uninherit& operator=(const Base_Uninherit& rhs){ return *this; }
public:
static Base_Uninherit* construct(){ //只能通过这种方式在堆上构造一个对象
Base_Uninherit* pb=new Base_Uninherit();
return pb;
}
~Base_Uninherit();
};
class Derived_Uninherit:public Base_Uninherit{
};
这种情况下,虽然基类不能被继承,但是基类也不能在栈上初始化,只能通过类静态方法的形式在堆上创建一个对象。
2)利用友元类
首先声明一个辅助的模板基类,将其构造函数设为私有,只有声明的友元类可以访问。则所有以FinalClass形式继承该基类的类都不能再被继承。并且FinalClass可以同时在堆和栈上创建。
template<typename T>
class Base{
friend T;
private:
Base(){}
~Base(){}
};
class FinalClass:virtual public Base<FinalClass>{
public:
FinalClass(){}
~FinalClass(){}
};
2、如何保证只能在堆上创建对象
将析构函数设为私有
C++是静态绑定语言,因此在编译期,所有的非虚函数都必须分析完成。即使是虚函数,也要检查可访问性。
当在栈上创建对象时,对象会自动析构,这就要求析构函数必须可以访问。
而在堆上创建对象时,析构的时机由程序员控制,因此不一定需要析构函数
因此当析构函数是私有的,如果在栈上创建对象,编译就会报错
3、如何保证只能在栈上创建对象
在堆上创建对象都是通过new操作符来实现的,因此禁用new操作符,将operator new设为私有的就可以保证不能在堆上创建对象