2016-04-28 11 views
-2

私は何かに質問をしました。 stringintの引数を持つcurrentCircleというCircleオブジェクトを作成しようとすると、変数currentCircleを抽象タイプに宣言できないというエラーが表示されます。シェイプは抽象クラスだと思っていましたが、サークルオブジェクトを宣言する別の方法はありますか?クラス階層C++

#include "Shape.h" 
#include "Circle.h" 
#include "Rectangle.h" 
#include "Triangle.h" 
int main() { 
//  Shape circle1("blue"); 
    Circle currentCircle("blue", 5); 

    cout << "Printing all shapes...\n"; 
    currentCircle.print(); 

return 0; 
} 

Shapeクラス(抽象基底クラス)

class Shape { 
    public: 
    Shape()       : color("")  { } 
    Shape(const string& newColor) : color(newColor) { } 
    virtual ~Shape(); 
    virtual void print() const  { cout << color; } 
    virtual void print() = 0; 
    virtual double getArea() = 0; 

    private: 
    string color; 
}; 

円クラス(派生クラス)

#include "Shape.h" 

class Circle : public Shape { 
    public: 
    Circle(const string& newColor, int newRadius); 
    virtual ~Circle(); 
    double getArea(); 
    void print() const; 

    private: 
    int radius; 
}; 

Circle::Circle(const string& newColor, int newRadius) { 
    radius = newRadius; 
    Shape(newColor); 
} 

double Circle::getArea() { 
    return (3.14*radius*radius); 
} 

void Circle::print() const{ 
    print(Shape); 
    cout << "circle, radius " << radius; 
} 
+0

コードには完全な欠陥があります。ここで本を書くのに必要なのは、あなたの質問に答えるための基礎を拾い読みする必要があるということです。これは意図したスタックオーバーフロー形式には広すぎます。 –

+0

または、 'Shape'に' virtual void print()= 0; 'を取り除いてください – NathanOliver

+0

これは本当ですか?あなたが知っているコードまたはあなたが始まったコード? – NathanOliver

答えて

0

クラスCircleprint方法手段const修飾子を有します実際には何も上書きしていません。Shapeから正しいメソッドをオーバーライドしていません。

constprintから削除してCircleにしてこの問題を解決してください。

ところで、これを簡単に見つけるには、基本クラスからオーバーライドする派生クラスメソッドのoverrideキーワードを使用します。署名が異なる場合、コンパイラは、例えば、あなたがこうであることを示すエラーを与える:

class A { 

public: 

    A(); 

    virtual void foo() const; 
    virtual void bar(); 

} 

class B : A { 

public: 

    B(); 

    void foo() const override; 
    void bar() override; 

    void bar() const override; // would result in error, signatures do not match 
} 

はさらに、以下は正しくありません。

void Circle::print() { 
    print(Shape); // Error Here 
    std::cout << "circle, radius " << radius; 
} 

それは、(例えば)でなければなりません:

void Circle::print() { 
    Shape::print(); 
    // ... etc. 
} 
+0

その例をありがとう!それは助けて、今働いて!説明と例を提供してくれて本当に助けてくれてありがとう。 –

+0

@VictorAmaro正解で助けられたと思うなら、upvoteと肯定的な答えを忘れないでください;) – ArchbishopOfBanterbury