28

我有一个基类

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;

但是,我目前正在处理一个单独的类中的碰撞。我可以把所有东西都移过来,但我想知道是否有办法让一个类抽象......没有纯虚函数。

4

3 回答 3

52

您可以声明并实现一个纯虚拟析构函数:

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

ShapeF::~ShapeF() {}

这是您已经拥有的一小步,并且会阻止ShapeF直接实例化。派生类不需要更改。

于 2013-01-31T17:33:18.393 回答
27

尝试使用受保护的构造函数

于 2013-01-31T17:36:12.807 回答
-2

如果您的编译器是 Visual C++,那么还有一个“抽象”关键字:

class MyClass abstract
{
    // whatever...
};

虽然 AFAIK 它不会在其他编译器上编译,但它是 Microsoft 自定义关键字之一。

于 2019-11-20T18:42:22.657 回答