2012-08-08 153 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用作基类为另一个派生类。