没有纯虚函数的C ++抽象类?

时间:2013-01-31 17:32:01

标签: c++ polymorphism abstract-class pure-virtual

我有一个基类

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;

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

3 个答案:

答案 0 :(得分:43)

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

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

ShapeF::~ShapeF() {}

与您已有的相比,它只是一小步,并且会阻止ShapeF直接实例化。派生类不需要改变。

答案 1 :(得分:18)

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

答案 2 :(得分:0)

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

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

尽管AFAIK不会在其他编译器上进行编译,但这是Microsoft自定义关键字之一。