2012-08-08 108 views
0

我正在學習C++中的繼承,而我是新抽象的純虛擬,基本和派生類。所以我想出了這個下面的代碼,它的工作原理,但我不知道我是否正確實施C++主體。請有人評估下面的代碼進行改進。繼承和純虛函數

#include <iostream> 
using namespace std; 

class Pizza 
{ 
    private: 
     double pCost; 
     double pPrice; 

    public: 
     Pizza(const double& c, const double& p) : pCost(c), pPrice(p){} 
     virtual ~Pizza(){} 
     virtual double area() = 0; 
     virtual double cost() = 0; 
     virtual double price() = 0; 
     virtual double profit() = 0; 
     double getCost() const {return pCost;} 
     double getPrice() const {return pPrice;} 
}; 

class CircularPizza : public Pizza 
{ 
    private: 
     double radius; 

    public: 
     CircularPizza(const double& r, const double& c, const double& p) 
     : Pizza(c, p), radius(r){} 
     virtual ~CircularPizza(){} 
     virtual double area(){ return (3.14 * radius * radius);} 
     virtual double cost() { return area() * getCost(); } 
     virtual double price() { return area() * getPrice(); } 
     virtual double profit() { return price() - cost();} 
}; 
+1

你可能會更好地服務[問這裏](http://codereview.stackexchange.com/)。該網站是用於代碼審查。 – ChiefTwoPencils 2012-08-08 22:22:05

回答

1

如果我改變什麼,我會做cost(), price()profit()是非虛擬和在基Pizza類定義它們。

這是有道理的,因爲它們都依賴於區域 - 這是CircularPizza真正定義的唯一東西。如果您要製作一個RectangularPizza課程,每個區域的成本,每個區域的價格以及利潤的計算都是相同的。唯一會改變的是該地區本身。意識到這一點,應該引導你用相同的方式設計類,其中只有區域發生變化,其他代碼對於使用基類的CircularPizzaRectangularPizza都是通用的。

+0

謝謝你,現在我明白了:) – newbieLinuxCpp 2012-08-08 22:27:32

+0

@paddy是正確的你的命名。將'getCost()'重命名爲'getCostPerUnitArea()','getPrice()'的重寫會使它更清晰。 – Hbcdev 2012-08-08 22:29:34

1

這看起來不錯...但是,有一個getCost()方法以及cost()是奇怪的。與價格相同......如果成本和價格函數的全部內容都針對具體實施,那麼提供對內部pCost和成員的訪問似乎並不正確。

也許這只是一個命名的事情?由於您在構造函數中提供了成本和價格,所以稍後可以查詢它們就足夠了。因此,在這種情況下,存在一個語義問題(無論如何,在我眼中)與cost()price()成員的名稱。或者,也許你的意思是「單位成本」和「總成本」。

您可能想考慮使成員變量受保護而不是私有。

就你的C++而言,它看起來都很好,除非可能那些虛擬函數如果不修改類(這樣它們可以在類的const實例上調用),它們應該是常量。

此外,爲了完整起見,您可能需要實現功能CircularPizza::getRadius()以與Pizza類提供的功能保持一致。

+0

是的,你是對的,我需要做出這些改變。謝謝。 – newbieLinuxCpp 2012-08-08 22:32:44

0

另一點值得一提的是,CircularPizza對象中的area(),cost(),price()和profit()函數不需要是虛擬的,除非您打算將CircularPizza用作基類爲另一個派生類。