我有一个基类
class ShapeF
{
public:
ShapeF();
virtual ~ShapeF();
inline void SetPosition(const Vector2& inPosition) { mPosition.Set(inPosition); }
protected:
Vector2 mPosition;
}
显然有一些省略的代码,但你明白了。 我使用它作为模板,并使用一些有趣(ommited)枚举,一种确定我使用
的形状的方法class RotatedRectangleF : public ShapeF
{
public:
RotatedRectangleF();
virtual ~RotatedRectangleF();
protected:
float mWidth;
float mHeight;
float mRotation;
}
ShapeF完成定位的工作,以及定义类型的枚举。 它有访问器和mutator,但没有方法。
我可以将ShapeF设为抽象类,以确保没有人尝试并实例化ShapeF类型的对象吗?
通常,通过在ShapeF中使用纯虚函数
可以实现这一点//ShapeF.h
virtual void Collides(const ShapeF& inShape) = 0;
但是,我目前正处理一个单独的类中的碰撞。 我可以把所有东西都移过来,但是我想知道是否有办法让一个类抽象......没有纯虚函数。
答案 0 :(得分:43)
您可以声明,并实现,一个纯虚拟析构函数:
class ShapeF
{
public:
virtual ~ShapeF() = 0;
...
};
ShapeF::~ShapeF() {}
与您已有的相比,它只是一小步,并且会阻止ShapeF
直接实例化。派生类不需要改变。
答案 1 :(得分:18)
尝试使用受保护的构造函数
答案 2 :(得分:0)
如果您的编译器是Visual C ++,则还有一个“抽象”关键字:
class MyClass abstract
{
// whatever...
};
尽管AFAIK不会在其他编译器上进行编译,但这是Microsoft自定义关键字之一。