Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承与纯虚函数 我在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();} }; #包括 使用名称空间std; 高级披萨 { 私人: 双pCost; 双pPrice; 公众: 比萨饼(常双和c,常双和p):成本(c),价格(p){} 虚拟~Pizza(){} 虚拟双区()=0; 虚拟双重成本()=0; 虚拟双倍价格()=0; 虚拟双利润()=0; double getCost()常量{return pCost;} double getPrice()常量{return pPrice;} }; 班级循环比萨:公共比萨 { 私人: 双半径; 公众: CircularPizza(常数双和r、常数双和c、常数双和p) :Pizza(c,p),半径(r){ 虚拟~CircularPizza(){} 虚拟双区域(){return(3.14*radius*radius);} 虚拟双成本(){return area()*getCost();} 虚拟双价格(){return area()*getPrice();} 虚拟双重利润(){返回价格()-成本();} };_C++_Inheritance_Abstract Class_Pure Virtual - Fatal编程技术网

继承与纯虚函数 我在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();} }; #包括 使用名称空间std; 高级披萨 { 私人: 双pCost; 双pPrice; 公众: 比萨饼(常双和c,常双和p):成本(c),价格(p){} 虚拟~Pizza(){} 虚拟双区()=0; 虚拟双重成本()=0; 虚拟双倍价格()=0; 虚拟双利润()=0; double getCost()常量{return pCost;} double getPrice()常量{return pPrice;} }; 班级循环比萨:公共比萨 { 私人: 双半径; 公众: CircularPizza(常数双和r、常数双和c、常数双和p) :Pizza(c,p),半径(r){ 虚拟~CircularPizza(){} 虚拟双区域(){return(3.14*radius*radius);} 虚拟双成本(){return area()*getCost();} 虚拟双价格(){return area()*getPrice();} 虚拟双重利润(){返回价格()-成本();} };

继承与纯虚函数 我在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();} }; #包括 使用名称空间std; 高级披萨 { 私人: 双pCost; 双pPrice; 公众: 比萨饼(常双和c,常双和p):成本(c),价格(p){} 虚拟~Pizza(){} 虚拟双区()=0; 虚拟双重成本()=0; 虚拟双倍价格()=0; 虚拟双利润()=0; double getCost()常量{return pCost;} double getPrice()常量{return pPrice;} }; 班级循环比萨:公共比萨 { 私人: 双半径; 公众: CircularPizza(常数双和r、常数双和c、常数双和p) :Pizza(c,p),半径(r){ 虚拟~CircularPizza(){} 虚拟双区域(){return(3.14*radius*radius);} 虚拟双成本(){return area()*getCost();} 虚拟双价格(){return area()*getPrice();} 虚拟双重利润(){返回价格()-成本();} };,c++,inheritance,abstract-class,pure-virtual,C++,Inheritance,Abstract Class,Pure Virtual,如果我要更改任何内容,我会将成本()、价格()和利润()设置为非虚拟,并在基本比萨饼类中定义它们 这是有意义的,因为它们都依赖于面积——这是CircularPizza真正定义的唯一东西。如果你要做一个RectangularPizza类,那么每个区域的成本,每个区域的价格,利润的计算都是一样的。唯一会改变的就是这个区域本身。认识到这一点,你就应该以同样的方式设计类,其中只有面积变化和其他代码是使用基类的CircularPizza和RectangularPizza所共有的。。。然而,有一个getCo

如果我要更改任何内容,我会将
成本()、价格()
利润()
设置为非虚拟,并在基本
比萨饼
类中定义它们


这是有意义的,因为它们都依赖于面积——这是
CircularPizza
真正定义的唯一东西。如果你要做一个
RectangularPizza
类,那么每个区域的成本,每个区域的价格,利润的计算都是一样的。唯一会改变的就是这个区域本身。认识到这一点,你就应该以同样的方式设计类,其中只有面积变化和其他代码是使用基类的
CircularPizza
RectangularPizza
所共有的。。。然而,有一个
getCost()
方法和
cost()
方法是很奇怪的。价格也一样。。。如果成本和价格函数的全部要点是特定于实现的,那么提供对内部
pCost
pPrice
成员的访问似乎是不对的

也许只是命名的问题?因为您在构造函数中提供了成本和价格,所以稍后可以查询这些成本和价格是公平的。因此,在这种情况下,
cost()
price()
成员的名称存在语义问题(在我看来)。或者你的意思是“单位成本”和“总成本”

您可能想考虑将成员变量保护而不是私有变量。< /P>

在C++方面,所有的看起来都不错,除非这些虚拟函数不修改类(如果它们可以在类的一个实例上调用),那么它们应该是常数。


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

对于家庭作业,看起来不错。考虑额外阅读。此外,我发现,与C#类似,它也很有用。

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

您可能会得到更好的服务。该网站是为了代码审查。谢谢你,现在我更好地理解了:)和@paddy关于你的命名是正确的。将
getCost()
重命名为
getCostPerUnitArea()
,对
getPrice()
进行重命名将使其更清晰。是的,您是对的,我需要进行这些更改。非常感谢。