2013-02-27 26 views
32

私は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()、そして私のCircleクラスでvolume()これは"Error: inherited member is not allowed"を示した。私は私のクラスpptを通って、答えのためにgoogledしかし運がない。どんな助けもありがとうございます。

+5

あなたはまだ、派生クラスで仮想メソッドを宣言する必要があります。 –

+3

'Shape'は抽象的に見えません。メンバ関数は純粋な仮想関数でなければなりません。さらに、仮想デストラクタを宣言する必要があります。 –

+0

'virtual〜Shape(){}'を宣言するのを忘れないでください。 –

答えて

42

あなたはここにvirtualの使用は任意であることを、あなたのクラス定義

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

ノートの一部としてオーバーだらけの関数を宣言する必要があります。

n.m。また、Shapeに仮想デストラクタも含める必要があります。あなたはまた、その仮想関数が純粋仮想したいことがありますCircleクラス

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

そして 'Circle'で' override'を使うのは良い考えです。 – bames53

+0

@ bames53 C++の 'override'キーワードはありますか?私は[Microsoftの拡張機能](http://msdn.microsoft.com/en-us/library/vstudio/41w3sh1c.aspx)を認識していますが、コードをコンパイルする必要があることを知る必要がありますそれを使用するMSVCのバージョン。 – simonc

+2

@imimc in C++ 11 – Slava

7

(約Shapeいる抽象的なあなたのコメントに基づいて)あなたが明示的に抽象クラスをシェイプます

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

あなたはヨーヨーの場合は、クラスの形での方法、および何がより重要であることを定義する必要はありません。この方法を派生クラスの抽象メソッドをオーバーライドするのを忘れて、そのインスタンスを作成しようとすると、コンパイラはあなたに思い出させます。あなたは、派生クラスで仮想メソッドをオーバーライドするとき 第二に、あなたはそれらを宣言する必要があります:

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

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

まずあなたがすべきではあまりにもオーバーライドメソッドを宣言する必要が

class Shape 
{ 
public: 
    virtual ~Shape() {} 
    virtual void area() = 0; 
    virtual void perimeter() = 0; 
    virtual void volume() = 0; 
}; 
関連する問題