CRTP - возможно ли сделать абстрактный базовый класс? - PullRequest
0 голосов
/ 26 мая 2019

Я реализую статический полиморфизм:

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() был чисто виртуальным.Таким образом, базовый класс был абстрактным.

Теперь эти классы реализуют статический полиморфизм и поэтому не имеют чисто виртуальных функций.

Можно ли сделать базовый класс абстрактным, чтобы объекты этого классане может быть создан?

1 Ответ

2 голосов
/ 26 мая 2019

Вы можете использовать защищенный деструктор и конструкторы:

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;
};

Это даже запретит функции-члены производного класса создавать объекты базового класса, а также будет пытаться удалить указатель со статическим типом * 1004.*.

...