C++ error: object of abstract class type ist nicht erlaubt: rein virtuelle Funktion hat keine overrider
Probleme mit der Vererbung. Ich habe keine Ahnung, was ich falsch mache.
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
Kreis.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
und dann in main.cpp auf die Zeile mit "Circle c1(5);"
bekomme ich die Fehlermeldung:
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
getArea()
undgetArea() const
sind zwei verschiedene Funktionen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Funktionen sollten sein:-
GRUND FÜR DIESES VERHALTEN :-
Wenn Sie re-definieren Sie eine Funktion in der abgeleiteten Klasse mit denselben Parametern wie in der Basisklasse, dann, dass heißt, als das überschreiben.
In der Erwägung, dass, wenn Sie re-definieren, dass die Funktion mit unterschiedlichen parameter-dann wäre es ein Versuch, die Verwendung überladen von Ihnen Seite. Aber überlastung ist nur möglich in der Klasse scope. Also, in diesem Fall die entsprechenden Basisklasse Funktion versteckt sein würde.
E.g:- Unten ist vergebliche Versuch auf überlastung.
So, Sie werden immer Fehler, da die Anzeige in abgeleiteten verbergen würde-display in der Basis.
Ebenso Ihre rein virtuelle Funktion versteckt sein würde ich.e-compiler behandeln, der Fall, da es keine definierte Funktion abgeleitet, die entsprechende Basis-Klasse rein virtuelle Funktion.Das würde abgeleitet auch eine abstrakte Klasse.
Hoffe, die Dinge sind glasklar...
using Base::display
. Auch dein Beispiel nicht kompilieren, daDerived
muss eine vom Benutzer bereitgestellte Konstruktor. Wenn Sie hinzufügen, dass es funktionieren wird (mit "Arbeit" meine ich die Ursache der erwartete Fehler) -- rextester.com/JZBTCZ77777Ihre
getArea()
undgetPerimeter()
Methoden nicht überschreiben Sie die virtuellen Methoden deklariertFigureGeometry
denn Sie passen nicht inconst
-Qualifikation. DaherCircle
Abstrakt wird, da diese Methoden waren pure virtual, und Sie können keine Objekte von abstrakten Typ.Dieses Problem zu beheben, fügen Sie einfach
const
zu beiden Methoden. Auch, um sicherzustellen, dass Sie haben richtig overrided Methoden aus der Basisklasse verwenden Sie dieoverride
Planer:Wenn Sie nicht außer Kraft setzen der compiler wird Sie wissen lassen, mit einer Fehlermeldung.
Du vergessen, qualifier
const
für diese virtuellen Funktionen in der abgeleiteten Klasse. SchreibenAlso in der Tat in der abgeleiteten Klasse deklarierte Funktionen ausblenden der virtuellen Funktionen in der Basisklasse mit demselben Namen.
Außerdem sollten Sie erklären den Destruktor auch als virtuelle. Zum Beispiel
Oder