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();}
};
4

4 回答 4

1

如果我要改变任何东西,我会制作cost(), price()profit()成为非虚拟并在基Pizza类中定义它们。

这是有道理的,因为它们都依赖于区域——这是唯一CircularPizza真正定义的东西。如果你做一个RectangularPizza班,每面积的成本,每面积的价格,利润的计算都是一样的。唯一会改变的是该地区本身。意识到这一事实应该引导您以相同的方式设计类,其中只有区域发生变化,其他代码对两者都是通用的,CircularPizza并且RectangularPizza使用基类。

于 2012-08-08T22:23:12.043 回答
1

看起来不错......但是,有一个getCost()方法以及cost(). 与价格相同...如果成本和价格函数的全部要点是特定于实现的,那么提供对内部pCostpPrice成员的访问似乎是不对的。

也许这只是一个命名的事情?由于您在构造函数中提供了成本和价格,因此以后能够查询这些是公平的。cost()因此,在这种情况下,和price()成员的名称存在语义问题(无论如何在我看来) 。或者您的意思可能是“单位成本”和“总成本”之类的东西。

您可能需要考虑使成员变量受保护而不是私有。

就您的 C++ 而言,这一切看起来都不错,除了那些不修改类的虚函数可能应该是常量(这样就可以在类的 const 实例上调用它们)。

此外,为了完整起见,您可能希望实现一个与类CircularPizza::getRadius()提供的功能一致的功能Pizza

于 2012-08-08T22:24:45.643 回答
0

对于家庭作业,看起来不错。如需更多阅读,请考虑何时使用私有虚拟功能。此外,我发现偶尔创建接口很有帮助,类似于 C#。

于 2012-08-08T22:26:58.923 回答
0

另一点值得一提的是,CircularPizza 对象中的 area()、cost()、price() 和 Profit() 函数不需要是虚拟的,除非您打算使用 CircularPizza 作为另一个派生类的基类.

于 2015-07-02T15:23:31.180 回答