CRTP - 是否可以创建一个抽象基类?

CRTP - Is it possible to make an abstract base class?

本文关键字:一个 抽象 基类 是否 创建 CRTP      更新时间:2023-10-16

我正在实现静态多态性:

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()是纯虚拟的。所以基类是抽象的。

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

是否可以使基类抽象,以便无法创建此类的对象?

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

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>的指针。