Pourquoi le membre hérité n'est-il pas autorisé?
Je suis débutant en C++ et je fais l'un des exercices sur la classe abstraite et l'héritage.
C'est 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 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 a montré "Error: inherited member is not allowed"
. Je suis passé par ma classe ppt et googlé pour la réponse, mais pas de chance. Toute aide est appréciée.
3 réponses
Vous devez déclarer les fonctions surchargées dans le cadre de votre définition de 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 facultatif.
Comme n. m. l'a noté, vous devez également inclure un destructeur virtuel dans Shape
. Vous pouvez également rendre ses fonctions virtuelles pures 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 override dans la classe Circle
class Circle : public Shape
{
public:
Circle(int);
virtual void area();
virtual void perimeter();
virtual void volume();
private:
int r;
};
Tout d'abord, vous devez vous faire une classe de forme 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 en forme de classe, et ce qui est plus important si vous oubliez de remplacer une méthode abstraite dans une classe dérivée et essayez d'en créer une instance, le compilateur vous le rappellera. Deuxième lorsque vous remplacez méthode virtuelle dans la 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;
};