首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRTP -可以创建一个抽象基类吗?

问CRTP -可以创建一个抽象基类吗?
EN

Stack Overflow用户
提问于 2019-05-26 23:55:10
回答 1查看 161关注 0票数 0

我正在实现一个静态多态性:

代码语言:javascript
复制
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()是纯虚拟的。所以基类是抽象的。

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

有没有可能让基类变得抽象,这样就不能创建这个类的对象了?

EN

回答 1

Stack Overflow用户

发布于 2019-05-27 00:22:15

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

代码语言:javascript
复制
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>的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56315106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档