web-dev-qa-db-fra.com

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.

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.

38
user1447343

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;
};
51
simonc

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;
    };
8
V-X

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;
};
2
Slava