不能被继承的类(构造函数是关键)

本文探讨如何通过将构造函数和析构函数设为私有,并利用友元关系来阻止类的继承。具体策略包括:1) 将基类的构造和析构设为Private,允许特定子类作为友元访问;2) 使用虚拟继承,使得子类无法直接调用私有构造函数。同时,介绍了友元关系的单向性和不可继承性,以及类模板在处理类型不同的类时的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的,也就是子类的构造函数。

	使用友元、虚继承、模板来实现,如下:

1、将A的构造函数和析构函数都声明为Private,将B设置为A的友元类,那么B就可以访问A的私有的构造函数和析构函数,B可以正常构造;
2、目的使B的子类C不能被正常构造,可以让C直接调用A的私有的构造函数和析构函数,那么就是将B设置为A的虚拟继承类;
3、友元关系:单向性,不可继承,不可传递。所以C无法像B一样可以访问A的私有的,所以C调用A的构造函数时会报错。

类模板:针对仅数据成员和成员函数类型不同的类,可以写成模板:

#include <iostream>
 
using namespace std;
 
template<class T>
class A
{
		friend T;//注意这里不需要class关键字
		//将构造函数和构构函数都声明是私有的
		private :
			A()
			{
			}
			~A()
			{ 
			} 
};

 //这里一定需要使用虚继承,只有使用虚继承,它的子类才会直接调用A类的构造函数
 //这样才会报错,如果是普通继承,那么通过B类调用A类的构造函数时时不会报错的
class B:public virtual  A<B> 
{	
};
 
class C:public B
{ 
};
 
int main()
{
	B b;
	cout<<"success"<<endl;
//	C c;
	return 0; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值