53

私は C++ の初心者で、抽象クラスと継承に関する演習の 1 つを行っています。

これは私の抽象クラスです:

#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()、. 私はクラスのpptを調べて答えを求めましたが、運がありませんでした. どんな助けでも大歓迎です。Circle"Error: inherited member is not allowed"

4

3 に答える 3

71

オーバーライドされた関数をクラス定義の一部として宣言する必要があります

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

virtualhere の使用はオプションであることに注意してください。

nm が指摘したように、仮想デストラクタも に含める必要がありますShapeShape仮想関数を純粋仮想にすることもできます(抽象的であることについてのコメントに基づいて)

class Shape
{
public:
    virtual ~Shape() {}
    virtual void area() = 0;
    virtual void perimeter() = 0;
    virtual void volume() = 0;
};
于 2013-02-27T16:48:46.947 に答える
9

Circle クラスでもオーバーライド メソッドを宣言する必要があります。

class Circle : public Shape
    {
    public:
        Circle(int);
        virtual void area();
        virtual void perimeter();
        virtual void volume();
    private:
        int r;
    };
于 2013-02-27T16:49:35.587 に答える
5

まず、 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;
};
于 2013-02-27T16:56:25.153 に答える