Je suis débutant en C++ et je fais l'un des exercices sur la classe abstraite et l'héritage.
Voici ma classe abstraite:
#ifndef SHAPE_H
#define SHAPE_H
class Shape
{
public:
virtual void area();
virtual void perimeter();
virtual void volume();
};
#endif
C'est ma classe concrète qui implémente la classe abstraite:
#include <iostream>
#include <cmath>
#include "Shape.h"
using namespace std;
class Circle : public Shape
{
public:
Circle(int);
private:
int r;
};
Circle::Circle(int rad)
{
r = rad;
}
void Circle::area()
{
cout << "Area of this cirle = " << 3.14 * pow(r, 2) << endl;
}
void Circle::perimeter()
{
cout << "Perimeter of this cirle = " << 2 * 3.14 * r << endl;
}
void Circle::volume()
{
cout << "Volume is not defined for circle." << endl;
}
J'ai des lignes rouges sous area()
, perimeter()
et volume()
dans ma classe Circle
, qui montrait "Error: inherited member is not allowed"
. J'ai parcouru ma classe ppt et googlé pour réponse mais pas de chance. Toute aide est appréciée.
Vous devez déclarer les fonctions écrasées dans le cadre de la définition de votre classe
class Circle : public Shape
{
public:
Circle(int);
virtual void area(); // overrides Shape::area
void perimeter(); // overrides Shape::perimeter
virtual void volume();
private:
int r;
};
Notez que l'utilisation de virtual
ici est facultative.
Comme n.m. notez, vous devez également inclure un destructeur virtuel dans Shape
. Vous pouvez également vouloir rendre ses fonctions virtuelles purement virtuelles (en fonction de votre commentaire sur Shape
étant abstrait)
class Shape
{
public:
virtual ~Shape() {}
virtual void area() = 0;
virtual void perimeter() = 0;
virtual void volume() = 0;
};
vous devez également déclarer les méthodes de remplacement dans la classe Circle
class Circle : public Shape
{
public:
Circle(int);
virtual void area();
virtual void perimeter();
virtual void volume();
private:
int r;
};
Vous devez d'abord rendre votre classe Shape explicitement abstraite:
class Shape
{
public:
virtual void area() = 0;
virtual void perimeter() = 0;
virtual void volume() = 0;
};
De cette façon, vous n'avez pas à définir ces méthodes dans la classe Shape, et ce qui est plus important si vous oubliez de remplacer l'une des méthodes abstraites dans la classe dérivée et essayez d'en créer une instance, le compilateur vous le rappellera. Deuxièmement, lorsque vous substituez une méthode virtuelle dans une classe dérivée, vous devez les déclarer:
class Circle : public Shape
{
public:
Circle(int);
virtual void area();
virtual void perimeter();
virtual void volume();
private:
int r;
};