我正在学习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();}
};

最佳答案

如果要进行任何更改,我将使cost(), price()profit()为非虚拟的,并在基本的Pizza类中对其进行定义。

这是有道理的,因为它们都取决于区域-这是CircularPizza真正定义的唯一内容。如果要创建RectangularPizza类,则每单位面积的成本,每单位面积的价格,利润的计算方法是相同的。唯一会改变的是区域本身。意识到这一事实之后,您应该以相同的方式设计类,在这种情况下,只有基区域发生变化,并且其他代码对于使用基类的CircularPizzaRectangularPizza都是通用的。

09-11 12:06