在c++中,怎么能写出一个不能继承的类呢?
结论是友元+虚继承,接下来进行一步一步分析。
定义一个不能被继承的类,首先要从构造函数为出发点进行思考。
现在假设B是一个不能被继承的类,那么如果存在B的子类C,那么C的构造过程应该会报错,那么如何能够让B能正常构造而C不能正常构造呢?
- 将A的构造函数和析构函数都声明为private的,但是将B作为A的友元类,这样B就可以访问A的构造函数和析构函数了,此时B能正常构造;
- 为了使B的子类C不能被正常构造,在这个继承体系中存在了虚基类,所以是跳过了B直接调用A的构造函数.
- 因为友元关系是不能被继承的,所以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;
}