Подтвердить что ты не робот

С++ абстрактный класс без чистых виртуальных функций?

У меня есть базовый класс

class ShapeF
{
public:
    ShapeF();
    virtual ~ShapeF();

    inline void SetPosition(const Vector2& inPosition) { mPosition.Set(inPosition); }

protected:
    Vector2 mPosition;
}

Очевидно, с некоторым оммитированным кодом, но вы поняли суть. Я использую это как шаблон и с некоторыми забавными (оммитированными) перечислениями, способ определить, какую форму я использую

class RotatedRectangleF : public ShapeF
{
public:
    RotatedRectangleF();
    virtual ~RotatedRectangleF();
protected:
    float mWidth;
    float mHeight;
    float mRotation;
}

ShapeF выполняет свою работу с позиционированием и перечислением, которое определяет тип. У него есть аксессоры и мутаторы, но нет методов.

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

Обычно это можно сделать, имея чистую виртуальную функцию в ShapeF

//ShapeF.h
virtual void Collides(const ShapeF& inShape) = 0;

Однако в настоящее время я столкнулся с конфликтами в отдельном классе. Я могу все переместить, но мне интересно, есть ли способ сделать абстрактное класс... без чистых виртуальных функций.

4b9b3361

Ответ 1

Вы можете объявить и реализовать чистый виртуальный деструктор:

class ShapeF
{
public:
    virtual ~ShapeF() = 0;
    ...
};

ShapeF::~ShapeF() {}

Это крошечный шаг от того, что у вас уже есть, и предотвратит непосредственное создание ShapeF. Производные классы не нуждаются в изменении.

Ответ 2

Попробуйте использовать защищенный конструктор