2012-12-18 98 views
0

繼承程序class polygon這是基類,我創建了派生類調用矩形。在我的多邊形基類中,我有一個構造函數和析構函數,還有兩個用於面積和周長的函數。在我的派生類中,我有一個構造函數和析構函數,以及兩個用於面積和周長的函數,calc areacalc perimeter函數。 我不明白的是我現在運行這個程序時得到的輸出。我想要的輸出是area = 45 perimeter = 28。當我使用rect_1.calcarea()但我想用rect_1.printarea()時,我得到這個輸出。我不明白我得到這個程序的輸出。

#include<iostream> 
using namespace std; 

class polygon 
{ 

protected: 
    double area; 
    double perimeter; 
public: 
    polygon(){} 
    virtual ~polygon(){ } 
    virtual double printarea() const { return area ;} 
    virtual double printperimeter() const { return perimeter ;} 
}; 

class rectangle : public polygon 
{ 

public: 
    rectangle(double , double) ; 
    ~rectangle(){ } 
    double calcarea() ; 
    double calcperimeter() ; 
    virtual double printarea() const { return area ;} 
    virtual double printperimeter() const { return perimeter ;} 

private: 
    double length; 
    double width; 
}; 

rectangle::rectangle(double l , double w) 
{ 
    length = l; 
    width = w; 
} 

double rectangle::calcarea() 
{ 
    area = length*width; 
    return area; 
} 

double rectangle::calcperimeter() 
{ 
    perimeter = length + width; 
    perimeter = perimeter * 2; 
    return perimeter; 
} 

void main() 
{ 
    rectangle rect_1 (9.0, 5.0); 

    cout<<"The Area of Rect_1 is " <<rect_1.printarea() <<endl; 
    cout<<"The Perimeter of Rect_1 is " <<rect_1.printperimeter() <<endl; 

    system("pause"); 
} 
+1

你會得到什麼輸出? –

+0

你得到了什麼輸出? –

+0

Aside:http://www.stroustrup.com/bs_faq2.html#void-main –

回答

2

printarea()只是返回成員變量area的值。你是a)不將它初始化爲任何東西,b)不計算任何地方的面積。

由於區域未初始化(即給定值),我猜測您的輸出爲零或垃圾 - 取決於編譯器選項。

如果在矩形的構造函數內部調用calcarea(),或者在實例化它的實例後調用calcarea(),那麼printarea()會產生正確的值。您甚至可以在printarea()的內部撥打calcarea()以確保在需要時該值始終保持最新。

+1

或在'printarea()'中調用'calcarea()'。 –

0

請嘗試下面的解決方案。這將解決您的問題。

以下是我已經改變了:
我已經多邊形爲抽象類,只要你想打電話只printareaPolygonprintperimeter。此外,我分別撥打calcareacalcperimeter。儘管在Rectangleprintarea/printperimeter的主體中也可以做到這一點。沒有必要撥打calcareacalcperimeter

#include<iostream> 

using namespace std; 

class polygon 
{ 

protected: 
    double area; 
    double perimeter; 
public: 
    polygon(){} 
    virtual ~polygon(){ } 
    virtual double printarea() = 0; 
    virtual double printperimeter() = 0; 
}; 

class rectangle : public polygon 
{ 

public: 
    rectangle(double , double) ; 
    ~rectangle(){ } 
    double calcarea() ; 
    double calcperimeter() ; 
    double printarea() { return calcarea();} 
    double printperimeter() { return calcperimeter() ;} 

private: 
    double length; 
    double width; 
}; 

rectangle::rectangle(double l , double w) 
{ 
    length = l; 
    width = w; 
} 

double rectangle::calcarea() 
{ 
    area = length*width; 
    return area; 
} 

double rectangle::calcperimeter() 
{ 
    perimeter = length + width; 
    perimeter = perimeter * 2; 
    return perimeter; 
} 

void main() 
{ 
    rectangle rect_1 (9.0, 5.0); 

    cout<<"The Area of Rect_1 is " <<rect_1.printarea() <<endl; 
    cout<<"The Perimeter of Rect_1 is " <<rect_1.printperimeter() <<endl; 

    system("pause"); 
} 
+0

你有什麼改變?有什麼問題? – jogojapan

+0

我已將Polygon作爲抽象類。因爲他只想打電話給多邊形的打印機或打印測量儀。 Furhter分別稱爲calcarea和calcperimeter。儘管可以在Rectangle的printarea/printperimeter主體中完成相同的操作。無需調用calcarea和calcperimeter。 – Nipun

相關問題