设计一个类不能被继承、设计一个类只能在堆上创建实例,设计一个类只能在栈上创建实例
方式一:把构造函数声明为私有函数(该方法创建的类只能在堆上创建实例)
在C#中有关键字sealed,在Java中有关键字final它们修饰的类不能被继承
在C++中我们知道,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数,所以我们可以把父类的构造函数和析构函数定义为私有函数
同时我们可以定义两个公有的静态函数来创建对象和释放对象,以达到创建实例的目的
class A
{
public:
static A* GetA()
{
return new A();
}
static void DeleteA(A* a)
{
delete a;
}
private:
A(){}
~A(){}
};
方式二:利用虚拟继承
B类使用起来和其它的类型没有什么区别,可以在堆上也可以在栈上创建实例。因为B类是A< B >类的友元类型,所以可以调用它的私有函数
但如果想从B类继承一个类的话,由于B 类是由A< B >类虚拟继承来的,所以就会跳过B类直接调用A< B >类的构造函数,而别的类并不是A< B >的友元类型所以不能调用
template <class T>
class A
{
friend T;
private:
A(){}
~A(){}
};
class B :virtual public A<B>
{
public:
B(){}
~B(){}
};
只能在栈上创建实例:
只有使用new运算符,才会在堆上创建实例,只要禁用new运算符就可以保证只在栈上创建实例
class B
{
public:
B(){}
~B(){}
private:
void *operator new(size_t t){}
void operator delete(void *ptr){}
};