继承和纯虚函数

时间:2012-08-08 22:11:31

标签: c++ inheritance abstract-class pure-virtual

我正在学习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 个答案:

答案 0 :(得分:1)

如果我要更改任何内容,我会将cost(), price()profit()设为非虚拟,并在基础Pizza类中进行定义。

这是有道理的,因为它们都依赖于区域 - 这是CircularPizza唯一真正定义的东西。如果您要进行RectangularPizza课程,则每个区域的成本,每个区域的价格,利润的计算将是相同的。唯一可能改变的是该地区本身。实现这一事实应该导致您以相同的方式设计类,其中只有区域发生变化,而其他代码对于使用基类的CircularPizzaRectangularPizza都是通用的。

答案 1 :(得分:1)

看起来没问题......但是,getCost()方法和cost()方法很奇怪。与价格相同......如果成本和价格函数的整个点是特定于实现的,那么提供对内部pCostpPrice成员的访问似乎不正确。

也许这只是一个命名的事情?由于您在构造函数中提供了成本和价格,因此可以在以后查询这些内容。所以在这种情况下,有cost()price()成员的名称存在语义问题(在我眼中)。或许你的意思是“单位成本”和“总成本”。

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

就你的C ++而言,它看起来都没问题,除非这些虚函数可能在不修改类的情况下应该是常量(这样它们可以在类的const实例上调用)。

此外,为了完整性,您可能希望实现函数CircularPizza::getRadius()以与Pizza类提供的函数一致。

答案 2 :(得分:0)

对于家庭作业,看起来很好。如需更多阅读,请考虑this on when to use private virtual functions。另外我发现它对occasionally create interfaces很有帮助,类似于C#。

答案 3 :(得分:0)

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