遗产有问题.我不知道我做错了什么.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
然后在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
Run Code Online (Sandbox Code Playgroud)
你的职能应该是: -
float getArea() const {return getRadius() * getRadius() * PI;}
float getPerimeter() const {return getRadius() * 2 * PI;}
Run Code Online (Sandbox Code Playgroud)
这种行为的原因: -
当您在派生类中使用与基类中相同的参数重新定义函数时,则将其称为重写.然而,如果您使用不同的参数重新定义该函数,那么它将尝试使用您自己的重载.但是只能在类范围内进行重载.因此,在这种情况下,将隐藏相应的基类函数.
例如: - 下面是重载的徒劳尝试.
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....
}
Run Code Online (Sandbox Code Playgroud)
所以你得到错误,因为派生中的显示会隐藏在base中的显示.
类似地,你的纯虚函数将被隐藏,即编译器处理这种情况,因为没有在派生中定义的对应于基类纯虚函数的函数.这将使得派生也是一个抽象类.
希望事情很清楚......