Подтвердить что ты не робот

Почему унаследованный член не разрешен?

Я начинаю с С++, и я делаю одно из упражнений об абстрактном классе и наследовании.

Это мой абстрактный класс:

#ifndef   SHAPE_H 
#define  SHAPE_H
class Shape
{
    public:
        virtual void area();
        virtual void perimeter();
        virtual void volume();
};
#endif

Это мой конкретный класс, который реализует абстрактный класс:

#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;
}

Я получил красные строки под area(), perimeter() и volume() в моем классе Circle, который показал "Error: inherited member is not allowed". Я прошел через класс ppt и искал ответ, но не повезло. Любая помощь приветствуется.

4b9b3361

Ответ 1

Вы должны объявить перегруженные функции как часть определения вашего класса

class Circle : public Shape
    {
    public:
        Circle(int);
        virtual void area(); // overrides Shape::area
        void perimeter();    // overrides Shape::perimeter
        virtual void volume();
    private:
        int r;
    };

Обратите внимание, что использование virtual здесь необязательно.

As n.m. отметил, вы также должны включить виртуальный деструктор в Shape. Вы также можете сделать виртуальные функции чисто виртуальными (на основе вашего комментария о Shape быть абстрактным)

class Shape
{
public:
    virtual ~Shape() {}
    virtual void area() = 0;
    virtual void perimeter() = 0;
    virtual void volume() = 0;
};

Ответ 2

вы должны также объявить методы переопределения в классе Circle

class Circle : public Shape
    {
    public:
        Circle(int);
        virtual void area();
        virtual void perimeter();
        virtual void volume();
    private:
        int r;
    };

Ответ 3

Сначала вы должны сделать класс Shape явно абстрактным:

class Shape
{
public:
    virtual void area() = 0;
    virtual void perimeter() = 0;
    virtual void volume() = 0;
};

Таким образом, вам не нужно определять эти методы в классе Shape, и что более важно, если вы забудете переопределить любой абстрактный метод в производном классе и попытаетесь создать его экземпляр, компилятор вам напомнит. Во-вторых, если вы переопределите виртуальный метод в производном классе, вам нужно объявить их:

class Circle : public Shape
{
public:
    Circle(int);

    virtual void area();
    virtual void perimeter();
    virtual void volume();
private:
    int r;
};