CRTP - 是否可以创建一个抽象基类?
CRTP - Is it possible to make an abstract base class?
我正在实现静态多态性:
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>
的指针。
相关文章:
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 如何将抽象类的可访问性限制为另一个抽象类及其子类?
- 错误 - 变量类型 "X" 是一个抽象类 - c++
- CRTP - 是否可以创建一个抽象基类?
- 创建一个抽象类类型的集合,shared_ptr的抽象类向量
- 从另一个抽象类得出一个抽象类时,C 中的类重新定义错误
- C++使用*this从静态方法调用一个抽象方法
- 我可以覆盖一个抽象基类的成员吗
- 为工厂创建一个抽象工厂是否有意义
- 为什么gcc和clang允许我构造一个抽象类
- 如何重写调用另一个抽象类的抽象类的虚拟函数
- 用类似Java的c++实例化一个抽象类
- 在CPP中创建一个抽象类而不是基类会给我带来什么好处
- 在C++中,一个抽象类可以在没有纯虚拟函数的情况下实现吗
- c++中关于闭包的另一个抽象类问题
- VS c++编译器会错过一个抽象类的实例化吗?
- 在QML插件中注册一个C++抽象类,并从QML中引用它
- 为什么C++"虚拟"和"=0"都需要来描述一个抽象的方法?