c++:实现一个不能被继承的类

在c++中,怎么能写出一个不能继承的类呢?

结论是友元+虚继承,接下来进行一步一步分析。

定义一个不能被继承的类,首先要从构造函数为出发点进行思考。

现在假设B是一个不能被继承的类,那么如果存在B的子类C,那么C的构造过程应该会报错,那么如何能够让B能正常构造而C不能正常构造呢?

  1. 将A的构造函数和析构函数都声明为private的,但是将B作为A的友元类,这样B就可以访问A的构造函数和析构函数了,此时B能正常构造;
  2. 为了使B的子类C不能被正常构造,在这个继承体系中存在了虚基类,所以是跳过了B直接调用A的构造函数.
  3. 因为友元关系是不能被继承的,所以C调用A的构造函数时会报错

此时,B能调用A的构造函数,B的子类不能调用A的构造函数,B是一个不能被继承的类。

#include<iostream>
template<typename T>
class A
{
private:
	A(){}
	friend T;//B对A友元 ,A不对友元,友元具有单向性,友元不能继承,友元不能传递。
};


class B:virtual public A<B>   //虚继承,这里一定需要使用虚继承,只有使用虚继承,它的子类才会直接调用A类的构造函数,这样才会报错,
{
public:                          //如果是普通继承,那么通过B类调用A类的构造函数时时不会报错的

	B(int a) :ma(a){}
protected:
	int ma;
};


class C : public B
{
public:
	C(int b) :mb(b), B(b){}
protected:
	int mb;
};


int main()
{
	B b(10);
	//C c(10);
	return 0;
}

 


 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值