2014-01-06 64 views
0
class Polygon { 
    protected: 
    int width, height; 
    public: 
    void set_values (int a, int b) 
     { width=a; height=b; } 
}; 

class Rectangle: public Polygon { 
    public: 
    int area() 
     { return width*height; } 
}; 

int main() { 
    Rectangle rect; 
    Polygon * ppoly1 = ▭ 
    ppoly1->set_values (4,5); 
    cout << rect.area() << '\n'; 
    return 0; 
} 

在上面的例子中,什麼是ppoly1點,以及如何爲這個指針不能訪問矩形類的功能?爲什麼我的基類指針變量不能從派生類訪問函數?

爲什麼ppoly1->面積()是一個錯誤

謝謝!

+1

因爲只能通過基類指針訪問基類方法。 – juanchopanza

+1

,因爲Polygon沒有名爲area的函數。 – PlasmaHH

回答

6

表達式ppoly1->area()是錯誤,因爲ppoly1鍵入爲Polygon,其中沒有area方法聲明。當C++試圖評估該成員就基本上開始於Polygon認爲沒有命名area成員,因此會發出錯誤

這聽起來像你想給Polygon類型的area方法的概念沒有實現(強制派生類型提供一個)。如果是這樣的話,那麼你應該在Polygon

class Polygon { 
    ... 
    virtual ~Polygon() { } 
    virtual int area() = 0; 
}; 
0

基類聲明一個未實現的虛方法一無所知他們的派生類。當定義一個基類時,還沒有派生類。

變量ppoly1屬於Polygon *類型。類多邊形沒有方法區域,因此編譯器會發出錯誤。

如果你想爲派生類使用通用接口,你應該在基類中聲明它。例如

class Polygon { 
    protected: 
    int width, height; 
    public: 
    void set_values (int a, int b) 
     { width=a; height=b; } 
    virtual int area() const = 0; 
    virtual ~Polygon(){} 
}; 

class Rectangle: public Polygon { 
    public: 
    int area() const 
     { return width*height; } 
}; 

int main() { 
    Rectangle rect; 
    Polygon * ppoly1 = &rect; 
    ppoly1->set_values (4,5); 
    cout << rect.area() << '\n'; 
    return 0; 
} 
0

ppoly1是一個多邊形的指針。指針指向Rectangle對象的事實不能使其調用Rectangle函數;該類型仍然是Polygon*。爲使其能夠調用矩形函數,您需要將其設爲矩形指針,或者在您的多邊形類中實現虛擬方法,例如,

virtual int area() const; 

這意味着,當一個多邊形對象有area()調用它,它會去尋找的area()最派生的實例。在ppoly1這將是Rectangle->area()。您可以保持您的Rectangle代碼與以前一樣。

關於虛函數的維基百科:http://en.wikipedia.org/wiki/Virtual_function

相關問題