2016-04-28 68 views
-2

所以,我對某個東西有疑問。當試圖創建一個名爲currentCircle的Circle對象,其參數爲stringint時,我遇到了一個錯誤,它告訴我它不能將變量currentCircle聲明爲抽象類型。我認爲Shape是抽象類,是否有不同的方式來聲明Circle對象?所屬分類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

或者擺脫'虛擬無效print()= 0;''形狀'' – NathanOliver

+0

那麼什麼樣的代碼是真實的?你知道的代碼或你開始使用的代碼? – NathanOliver

回答

0

Circleprint方法具有const限定符這意味着它並不是凌駕於Shape的正確方法 - 它並不壓倒一切。

Circle中的print中刪除const來解決此問題。

順便說一下,一種簡單的方法是在派生類方法上使用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如果您認爲它正確並且有幫助,請不要忘記加註並接受答案;) – ArchbishopOfBanterbury