CRTP-是否可以制作抽象基类?

时间:2019-05-26 15:55:10

标签: c++ abstract-class crtp static-polymorphism

我正在实现静态多态性:

template<typename T>
class Base {
public:
    void method() {
         // do something
         impl();
         // do something else
    }
    void impl() { // intended to be private
        static_cast<T*>(this)->impl();
    }
};

class Derived : public Base<Derived> {
public:
     void impl() { // intended to be private
     }
};

此代码是动态多态类的静态实现,其中void impl()是纯虚拟的。所以基类是抽象的。

现在这些类实现了静态多态性,因此没有纯虚函数。

是否可以将Base类抽象化,以便不能创建此类的对象?

1 个答案:

答案 0 :(得分:2)

您可以使用受保护的析构函数和构造函数:

template<typename T>
class Base {
public:
    void method() {
         // do something
         impl();
         // do something else
    }
    void impl() { // intended to be private
        static_cast<T*>(this)->impl();
    }

protected:
    Base() = default;
    ~Base() = default;

    // If you don't want to implement proper copying/moving:
    // Base(const Base&) = delete;
    // Base(Base&&) = delete;
    // Base& operator=(const Base&) = delete;
    // Base& operator=(Base&&) = delete;
};

这甚至将禁止派生类的成员函数创建基类对象,并试图删除静态类型为Base<T>的指针。