实现一个不能被继承的类

在掌握了基本的继承关系时,为了加深理解和延伸知识,可以实现以下几个特殊的类:

1.实现一个不能被继承的类:

实现原理: 将类的构造函数声明成私有的。

class AA {                     //实现一个不能被继承的类----将基类的构造函数和析构函数声明成私有的,当派生类要构造基类时,就会因为
                               //无法调用基类的构造函数而出错				
public:
	static AA* GetObj()
	{
		return new AA;
	}
	static AA* DelObj(AA *pa)
	{
		delete pa;
		pa = NULL;
	}

private:
	AA(){}
	~AA(){}
};

int main()
{
	AA *pc = AA::GetObj();
	AA *pd = AA::DelObj(pc);
	return 0;
}

2.实现一个只能在栈上创建对象的类

class AA {                    //实现一个只能在栈上创建对象的类---1.将构造函数定义成私有的,只提供在栈上创建对象的方法
                              //                                  2.将 operator new 重载为私有
public:

	static AA  GetObj()
	{
		return AA();
	}

private:
	AA(int a = 0)
		:_a(a)
	{}

	//2.产生堆对象的唯一方法是使用new, 禁止使用new就可禁止产生堆对象.由于new执行时会调用operator new, 
	//而operator new是可重载的, 所以将operator new和operator delete重载为private即可,
	//但是该方法有缺陷--也能在静态区创建对象
	//static void* operator new(size_t size);
	//static void operator delete(void *p);

	int _a;
};

AA bb = AA::GetObj();
int main()
{
	AA aa = AA::GetObj();
	bb = aa;
	//AA *p = new AA;//编译报错---operator new + 构造函数
	return 0;
}

3.实现一个只能在堆上创建对象的类

为了防止先调用类提供的公有方法创建堆上的对象后,再利用拷贝构造函数和赋值运算符的重载而创建栈上的对象,这里提出类的防拷贝的操作,即将类的拷贝构造和赋值运算符的重载皆声明为私有。

class AA {			//实现一个只能在堆上创建对象的类---1.将构造函数声明称私有
public:

	static AA&  GetObj()              //返回引用
	{
		return *(new AA);
	}
	static AA* GetObj2(int n = 1)     //返回指针
	{
		return new AA(n);    
	}
	static AA* GetObj3(int n = 1)      //返回指针
	{
		return new AA[n];    
	}

private:
类的防拷贝:   1.声明成私有                2.只进行声明不定义
	AA(const AA& a);
	AA& operator=(const AA& a);

	AA(int a = 0)
		:_a(a)
	{}

	int _a;
};

int main()
{
	AA *p = AA::GetObj2(10);		//在堆上创建一个对象初始化_a为10
	AA *p2 = AA::GetObj3(10);		//在对上创建10个对象,_a都被默认的初始化为10

	return 0;
}




为了防止先调用类提供的公有方法创建堆上的对象后,在
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值