1.设计一个类不能被继承
将父类的构造和析构函数设为私有。
在C++中,子类的构造和析构函数会自动调用父类的构造和析构函数,所以将父类构造和析构设为私有后,子类继承时会由于试图调用父类构造函数而编译出错。
这时可以设计两个接口供外部创建对象
class AA
{
public:
static AA *GetInstance()
{
return new AA();
}
static void DeleteInstance(AA*pInstance)
{
delete pInstance;
}
private:
AA() {};
~AA() {};
};
//利用虚拟继承:
class AA
{
friend T;
private:
AA ();
~AA ();
};
class BB:virtual public AA
{
public:
BB();
~BB();
};
2.设计一个类只能在堆上创建对象
- 在堆上创建对象需要用到动态开辟空间,需要使用new
- new一个新对象分为两步:
调用operator new()在堆上查找合适大小的空间分配给新对象;
调用构造函数构造对象,对新开辟的空间进行初始化
class A
{
protected:
A(){}
~A(){}
public:
static A*create()
{
return new A();
}
void destory()
{
delete this ;
}
};
3.设计一个类只能在栈上创建对象
只有使用new运算符,对象才会建立在堆上,因此,只要禁用new运算符就可以实现类对象只能建立在栈上。将operator new()设为私有即可。
class A
{
public:
A(){}
~A(){}
private:
void* operator new(size_t t);
void operator delete(void* ptr);
};