c++定义不可被继承的类

创建日期2018-06-05 13:01
最后修改2018-10-23 20:50

不使用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对象,所以只要把FinalClassBase之间的继承改成虚继承(普通继承子类仅负责构造直接父类)即可使Derived在构造时必须直接构造Base部分,然而Derived访问不到Base的构造函数,所以Derived的对象就无法被构造,因而类FinalClass是不可被继承的。

CopyRight(C) Zheqi Yu 2016-2024