C ++错误:不允许抽象类类型的对象:纯虚函数没有覆盖

时间:2014-11-09 05:08:00

标签: c++

继承有问题。我不知道我做错了什么。

FigureGeometry.h

    #ifndef FIGUREGEOMETRY
#define FIGUREGEOMETRY

static const float PI = 3.14159f;

class FigureGeometry
{

public:
    virtual float getArea() const = 0;
    virtual float getPerimeter() const = 0;
};

#endif

Circle.h

    #ifndef CIRCLE
#define CIRCLE

#include "FigureGeometry.h"

class Circle:public FigureGeometry
{
    float radius;
public:
    Circle(float theRadius)
    {
        radius = theRadius;
    }
    float getRadius() {return radius;}
    float getArea() {return getRadius() * getRadius() * PI;}
    float getPerimeter() {return getRadius() * 2 * PI;}
};

#endif

然后在main.cpp中,在包含"Circle c1(5);"的行上,我收到错误:

21  IntelliSense: object of abstract class type "Circle" is not allowed:
            pure virtual function "FigureGeometry::getArea" has no overrider
            pure virtual function "FigureGeometry::getPerimeter" has no overrider   c:\Users\moog\Documents\Visual Studio 2012\Projects\data structures 3\data structures 3\main.cpp    9   9   data structures 3

3 个答案:

答案 0 :(得分:8)

您的功能应该是: -

float getArea() const {return getRadius() * getRadius() * PI;}
float getPerimeter() const {return getRadius() * 2 * PI;}

这种行为的原因: -

当您在派生类中使用与基类中相同的参数重新定义函数时,将其称为重写。 然而,如果您使用不同的参数重新定义该函数,那么它将尝试使用您自己的重载。但是只能在类范围内进行重载。因此,在这种情况下,将隐藏相应的基类函数。

例如: - 下面是重载的徒劳尝试。

class Base
{
public:
   virtual void display () const;
};

class Derived 
{
public:
   virtual void display ();
};

int main()
{
    const Derived d;
    d.display();           //Error::no version defined for const....
}

因此,您会收到错误,因为派生中的显示会隐藏显示在基础中。

类似地,您的纯虚函数将被隐藏,即编译器处理该情况,因为没有在派生中定义的对应于基类纯虚函数的函数。这将使得派生也是一个抽象类。

希望事情很清楚......

答案 1 :(得分:0)

您忘记在派生类中为这些虚函数放置限定符const。写

float getArea() const {return getRadius() * getRadius() * PI;}
float getPerimeter() const {return getRadius() * 2 * PI;}

事实上,在派生类中,您声明了新函数,这些函数隐藏了基类中具有相同名称的虚函数。

此外,您还应该将析构函数声明为虚拟。例如

class FigureGeometry
{
public:
    // ...
    virtual ~FigureGeometry() = default;
};

class FigureGeometry
{
public:
    // ...
    virtual ~FigureGeometry() {}
};

答案 2 :(得分:0)

您的getArea()getPerimeter()方法不会覆盖FigureGeometry中声明的虚拟方法,因为它们在const - 资格中不匹配。因此Circle变得抽象,因为这些方法是纯虚拟的;并且你不能创建抽象类型的对象。

要解决此问题,只需在您的两种方法中添加const即可。另外,要确保从基类中正确覆盖了方法,请使用override说明符:

float getArea() const override;
float getPerimeter() const override;

如果它们没有覆盖,编译器会通过错误消息通知您。