c++定义不可被继承的类
不使用final
关键字让类不可被继承
实现
template<class T>
class Base
{
friend T;
private:
Base() = default;
~Base() = default;
};
class FinalClass : public virtual Base<FinalClass>
{
public:
FinalClass() = default;
~FinalClass() = default;
};
/* Will not compile */
// class Derived : public FinalClass
// {
// public:
// Derived() = default;
// ~Derived() = default;
// };
解释
类Base
的构造函数和析构函数设置为private
使得子类和用户代码不能创建和销毁该类对象,但允许友元类T
创建和销毁
类FinalClass
通过public
继承于类Base
并且是类Base
的友元,因此类FinalClass
可以创建和销毁类Base
的对象,因而子类和用户代码可以创建和销毁类FinalClass
,即正常使用。类Base
是模板类的原因仅仅是让不同的final类存在不同的基类
为了使FinalClass
不能被继承,需让其子类Derived
无法构造。显然类Derived
无法构造Base
对象,所以只要把FinalClass
和Base
之间的继承改成虚继承(普通继承子类仅负责构造直接父类)即可使Derived
在构造时必须直接构造Base
部分,然而Derived
访问不到Base
的构造函数,所以Derived
的对象就无法被构造,因而类FinalClass
是不可被继承的。