我正在学习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();}
};
答案 0 :(得分:1)
如果我要更改任何内容,我会将cost(), price()
和profit()
设为非虚拟,并在基础Pizza
类中进行定义。
这是有道理的,因为它们都依赖于区域 - 这是CircularPizza
唯一真正定义的东西。如果您要进行RectangularPizza
课程,则每个区域的成本,每个区域的价格,利润的计算将是相同的。唯一可能改变的是该地区本身。实现这一事实应该导致您以相同的方式设计类,其中只有区域发生变化,而其他代码对于使用基类的CircularPizza
和RectangularPizza
都是通用的。
答案 1 :(得分:1)
看起来没问题......但是,getCost()
方法和cost()
方法很奇怪。与价格相同......如果成本和价格函数的整个点是特定于实现的,那么提供对内部pCost
和pPrice
成员的访问似乎不正确。
也许这只是一个命名的事情?由于您在构造函数中提供了成本和价格,因此可以在以后查询这些内容。所以在这种情况下,有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作为基础另一个派生类的类。