полиморфизм — абстрактный класс C ++ без чисто виртуальных функций?

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

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;

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

15

Решение

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

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

ShapeF::~ShapeF() {}

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

43

Другие решения

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

18

По вопросам рекламы [email protected]