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.

34
demandé sur Varaquilex 2013-02-27 20:46:56

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;
};
45
répondu simonc 2013-02-27 16:57:17

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;
    };
7
répondu V-X 2013-02-27 16:49:35

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;
};
2
répondu Slava 2013-02-27 16:56:25