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是不可被继承的。